using Microsoft.AspNetCore.Mvc;
using PlanTempus.Application.Features.Localization.Services;

namespace PlanTempus.Application.Features.Services.Components;

public class ServiceDetailPricesViewComponent : ViewComponent
{
    private readonly ILocalizationService _localization;

    public ServiceDetailPricesViewComponent(ILocalizationService localization)
    {
        _localization = localization;
    }

    public IViewComponentResult Invoke(string key)
    {
        var service = ServiceDetailCatalog.Get(key);

        var model = new ServiceDetailPricesViewModel
        {
            // Data
            PriceMode = service.PriceMode,
            SimplePrice = service.SimplePrice,
            PriceMatrix = service.PriceMatrix,
            VatRate = service.VatRate,
            ProductCost = service.ProductCost,
            Commission = service.Commission,
            MemberDiscount = service.MemberDiscount,
            GiftCardPayment = service.GiftCardPayment,
            LoyaltyPoints = service.LoyaltyPoints,

            // Labels - Price structure
            LabelPriceStructure = _localization.Get("services.detail.prices.priceStructure"),
            LabelSimplePrice = _localization.Get("services.detail.prices.simplePrice"),
            LabelMatrixPrice = _localization.Get("services.detail.prices.matrixPrice"),
            LabelPrice = _localization.Get("services.detail.prices.price"),
            LabelLevel = _localization.Get("services.detail.prices.level"),
            LabelShortHair = _localization.Get("services.detail.prices.shortHair"),
            LabelMediumHair = _localization.Get("services.detail.prices.mediumHair"),
            LabelLongHair = _localization.Get("services.detail.prices.longHair"),
            LabelExtraLongHair = _localization.Get("services.detail.prices.extraLongHair"),
            LabelAddLevel = _localization.Get("services.detail.prices.addLevel"),

            // Labels - Economy
            LabelEconomy = _localization.Get("services.detail.prices.economy"),
            LabelVatRate = _localization.Get("services.detail.prices.vatRate"),
            LabelProductCost = _localization.Get("services.detail.prices.productCost"),
            LabelCommission = _localization.Get("services.detail.prices.commission"),

            // Labels - Discounts
            LabelDiscounts = _localization.Get("services.detail.prices.discounts"),
            LabelMemberDiscount = _localization.Get("services.detail.prices.memberDiscount"),
            LabelGiftCardPayment = _localization.Get("services.detail.prices.giftCardPayment"),
            LabelLoyaltyPoints = _localization.Get("services.detail.prices.loyaltyPoints"),

            // Toggle labels
            ToggleYes = _localization.Get("common.yes"),
            ToggleNo = _localization.Get("common.no")
        };

        return View(model);
    }
}

public class ServiceDetailPricesViewModel
{
    // Data
    public PriceMode PriceMode { get; init; }
    public required string SimplePrice { get; init; }
    public required List<PriceMatrixRow> PriceMatrix { get; init; }
    public required string VatRate { get; init; }
    public required string ProductCost { get; init; }
    public required string Commission { get; init; }
    public bool MemberDiscount { get; init; }
    public bool GiftCardPayment { get; init; }
    public bool LoyaltyPoints { get; init; }

    // Labels - Price structure
    public required string LabelPriceStructure { get; init; }
    public required string LabelSimplePrice { get; init; }
    public required string LabelMatrixPrice { get; init; }
    public required string LabelPrice { get; init; }
    public required string LabelLevel { get; init; }
    public required string LabelShortHair { get; init; }
    public required string LabelMediumHair { get; init; }
    public required string LabelLongHair { get; init; }
    public required string LabelExtraLongHair { get; init; }
    public required string LabelAddLevel { get; init; }

    // Labels - Economy
    public required string LabelEconomy { get; init; }
    public required string LabelVatRate { get; init; }
    public required string LabelProductCost { get; init; }
    public required string LabelCommission { get; init; }

    // Labels - Discounts
    public required string LabelDiscounts { get; init; }
    public required string LabelMemberDiscount { get; init; }
    public required string LabelGiftCardPayment { get; init; }
    public required string LabelLoyaltyPoints { get; init; }

    // Toggle labels
    public required string ToggleYes { get; init; }
    public required string ToggleNo { get; init; }
}
