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

namespace PlanTempus.Application.Features.Services.Components;

public class ServiceDetailRulesViewComponent : ViewComponent
{
    private readonly ILocalizationService _localization;

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

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

        var model = new ServiceDetailRulesViewModel
        {
            // Data
            MinNotice = service.MinNotice,
            MaxAdvanceBooking = service.MaxAdvanceBooking,
            CancellationDeadline = service.CancellationDeadline,
            NoShowFee = service.NoShowFee,
            RequiresConsultation = service.RequiresConsultation,
            RequiresPatchTest = service.RequiresPatchTest,
            AgeRestriction = service.AgeRestriction,
            ShowInOnlineBooking = service.ShowInOnlineBookingRules,
            AllowEmployeeSelection = service.AllowEmployeeSelection,
            ShowPrice = service.ShowPrice,
            ShowDuration = service.ShowDuration,

            // Labels - Booking rules
            LabelBookingRules = _localization.Get("services.detail.rules.bookingRules"),
            LabelMinNotice = _localization.Get("services.detail.rules.minNotice"),
            LabelMaxAdvanceBooking = _localization.Get("services.detail.rules.maxAdvanceBooking"),
            LabelCancellationDeadline = _localization.Get("services.detail.rules.cancellationDeadline"),
            LabelNoShowFee = _localization.Get("services.detail.rules.noShowFee"),

            // Labels - Requirements
            LabelRequirements = _localization.Get("services.detail.rules.requirements"),
            LabelRequiresConsultation = _localization.Get("services.detail.rules.requiresConsultation"),
            LabelRequiresConsultationDesc = _localization.Get("services.detail.rules.requiresConsultationDesc"),
            LabelRequiresPatchTest = _localization.Get("services.detail.rules.requiresPatchTest"),
            LabelRequiresPatchTestDesc = _localization.Get("services.detail.rules.requiresPatchTestDesc"),
            LabelAgeRestriction = _localization.Get("services.detail.rules.ageRestriction"),
            LabelAgeRestrictionDesc = _localization.Get("services.detail.rules.ageRestrictionDesc"),

            // Labels - Online booking settings
            LabelOnlineBookingSettings = _localization.Get("services.detail.rules.onlineBookingSettings"),
            LabelShowInOnlineBooking = _localization.Get("services.detail.rules.showInOnlineBooking"),
            LabelAllowEmployeeSelection = _localization.Get("services.detail.rules.allowEmployeeSelection"),
            LabelShowPrice = _localization.Get("services.detail.rules.showPrice"),
            LabelShowDuration = _localization.Get("services.detail.rules.showDuration"),

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

        return View(model);
    }
}

public class ServiceDetailRulesViewModel
{
    // Data - Booking rules
    public required string MinNotice { get; init; }
    public required string MaxAdvanceBooking { get; init; }
    public required string CancellationDeadline { get; init; }
    public required string NoShowFee { get; init; }

    // Data - Requirements
    public bool RequiresConsultation { get; init; }
    public bool RequiresPatchTest { get; init; }
    public bool AgeRestriction { get; init; }

    // Data - Online booking settings
    public bool ShowInOnlineBooking { get; init; }
    public bool AllowEmployeeSelection { get; init; }
    public bool ShowPrice { get; init; }
    public bool ShowDuration { get; init; }

    // Labels - Booking rules
    public required string LabelBookingRules { get; init; }
    public required string LabelMinNotice { get; init; }
    public required string LabelMaxAdvanceBooking { get; init; }
    public required string LabelCancellationDeadline { get; init; }
    public required string LabelNoShowFee { get; init; }

    // Labels - Requirements
    public required string LabelRequirements { get; init; }
    public required string LabelRequiresConsultation { get; init; }
    public required string LabelRequiresConsultationDesc { get; init; }
    public required string LabelRequiresPatchTest { get; init; }
    public required string LabelRequiresPatchTestDesc { get; init; }
    public required string LabelAgeRestriction { get; init; }
    public required string LabelAgeRestrictionDesc { get; init; }

    // Labels - Online booking settings
    public required string LabelOnlineBookingSettings { get; init; }
    public required string LabelShowInOnlineBooking { get; init; }
    public required string LabelAllowEmployeeSelection { get; init; }
    public required string LabelShowPrice { get; init; }
    public required string LabelShowDuration { get; init; }

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