using CMSMicroservice.Protobuf.Protos.UserAddress;
using CMSMicroservice.Protobuf.Protos.City;
using Mapster;
using Microsoft.AspNetCore.Components;
using MudBlazor;
using Severity = MudBlazor.Severity;

namespace FrontOffice.Main.Pages.Profile.Components;

public partial class EditAddressDialog : ComponentBase
{
    [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = default!;
    [Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!;
    [Inject] private CityContract.CityContractClient CityContract { get; set; } = default!;

    [Parameter] public CustomerAddressModel? Model { get; set; }

    private MudForm? _form;
    private bool _isSaving;
    private UpdateCustomerAddressRequest _request = new();
    private object? _selectedCity;

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        if (Model != null)
        {
            _request = Model.Adapt<UpdateCustomerAddressRequest>();
            
            // Load selected city if CityId exists
            if (Model.CityId > 0)
            {
                await LoadCurrentCity(Model.CityId);
            }
        }
    }

    private async Task LoadCurrentCity(long cityId)
    {
        try
        {
            var response = await CityContract.GetAllCitiesByFilterAsync(new GetAllCitiesByFilterRequest
            {
                PaginationState = new CMSMicroservice.Protobuf.Protos.City.PaginationState { PageNumber = 1, PageSize = 1 },
                Filter = new GetAllCitiesByFilterFilter { Id = cityId }
            });
            
            _selectedCity = response?.Cities?.FirstOrDefault();
        }
        catch
        {
            // Ignore error loading city
        }
    }

    private async Task<IEnumerable<object>> SearchCities(string value, CancellationToken ct)
    {
        if (string.IsNullOrWhiteSpace(value) || value.Length < 2)
            return Enumerable.Empty<object>();

        try
        {
            var response = await CityContract.GetAllCitiesByFilterAsync(new GetAllCitiesByFilterRequest
            {
                PaginationState = new CMSMicroservice.Protobuf.Protos.City.PaginationState { PageNumber = 1, PageSize = 20 },
                Filter = new GetAllCitiesByFilterFilter { Name = value }
            });
            
            return response?.Cities?.Cast<object>() ?? Enumerable.Empty<object>();
        }
        catch
        {
            return Enumerable.Empty<object>();
        }
    }

    private async Task SaveAddress()
    {
        if (_form == null) return;

        await _form.Validate();
        if (!_form.IsValid || _selectedCity == null)
        {
            if (_selectedCity == null)
                Snackbar.Add("لطفاً شهر را انتخاب کنید.", Severity.Warning);
            return;
        }

        _request.CityId = (long)((dynamic)_selectedCity).Id;
        _isSaving = true;
        try
        {
            await UserAddressContract.UpdateCustomerAddressAsync(_request);
            Snackbar.Add("آدرس با موفقیت ویرایش شد.", Severity.Success);
            MudDialog.Close(DialogResult.Ok(true));
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا: {ex.Message}", Severity.Error);
        }
        finally
        {
            _isSaving = false;
            await InvokeAsync(StateHasChanged);
        }
    }

    private void Cancel() => MudDialog.Close(DialogResult.Cancel());
}