using Blazored.LocalStorage;
using FrontOffice.Main.Shared;
using FrontOffice.Main.Utilities;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.WebUtilities;
using MudBlazor;

namespace FrontOffice.Main;

public partial class App
{
    [Inject] private ILocalStorageService LocalStorage { get; set; } = default!;
    [Inject] private AuthService AuthService { get; set; } = default!;
    [Inject] private AppVersionService AppVersionService { get; set; } = default!;
    
    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();

        // Check app version and show update dialog if needed
        await CheckAndShowVersionUpdateAsync();

        // Check for referral code in URL query parameters
        var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
        var query = QueryHelpers.ParseQuery(uri.Query);

        if (query.TryGetValue("ref", out var refValues))
        {
            var referralCode = refValues.FirstOrDefault();
            if (!string.IsNullOrWhiteSpace(referralCode))
            {
                // Store referral code in local storage
                await LocalStorage.SetItemAsync("referral:code", referralCode);

                if(!await AuthService.IsAuthenticatedAsync())
                {
                    var options = new DialogOptions
                    {
                        BackdropClick = false,
                        CloseOnEscapeKey = false
                    };

                    var parameters = new DialogParameters<AuthDialog>
                    {
                        { x => x.HideCancelButton, true }
                    };
                    var dialog = await DialogService.ShowAsync<AuthDialog>("ورود به حساب کاربری", parameters, options);
                    var result = await dialog.Result;

                    if (!result.Canceled)
                    {
                        Snackbar.Add(GlobalConstants.SuccessMsg, Severity.Success);
                        await Task.Delay(1000);
                        Navigation.NavigateTo(Navigation.Uri, forceLoad: true);
                        StateHasChanged();
                    }
                }
            }
        }
    }

    /// <summary>
    /// بررسی نسخه و نمایش دیالوگ آپدیت در صورت نیاز
    /// فقط برای کاربران لاگین شده
    /// </summary>
    private async Task CheckAndShowVersionUpdateAsync()
    {
        try
        {
            // فقط برای کاربران لاگین شده
            if (!await AuthService.IsAuthenticatedAsync())
                return;
            
            // forDialog: true یعنی اگه skip کرده ولی یک روز گذشته، دوباره نشون بده
            var versionCheck = await AppVersionService.CheckVersionAsync(forDialog: true);
            
            if (!versionCheck.HasNewVersion || string.IsNullOrEmpty(versionCheck.NewVersion))
                return;
            
            // ثبت زمان نمایش دیالوگ
            await AppVersionService.RecordDialogShownAsync();
            
            // تنظیمات دیالوگ
            var dialogOptions = new DialogOptions
            {
                BackdropClick = !versionCheck.IsForceUpdate, // اگر force باشه نتونه بیرون کلیک کنه
                CloseOnEscapeKey = !versionCheck.IsForceUpdate,
                CloseButton = !versionCheck.IsForceUpdate,
                MaxWidth = MaxWidth.Small,
                FullWidth = true
            };
            
            var parameters = new DialogParameters<ReleaseNotesDialog>
            {
                { x => x.OldVersion, versionCheck.OldVersion },
                { x => x.NewVersion, versionCheck.NewVersion },
                { x => x.ReleaseNotes, versionCheck.ReleaseNotes },
                { x => x.UpdateMessage, versionCheck.UpdateMessage },
                { x => x.IsForceUpdate, versionCheck.IsForceUpdate }
            };
            
            var dialog = await DialogService.ShowAsync<ReleaseNotesDialog>("بروزرسانی", parameters, dialogOptions);
            var result = await dialog.Result;
            
            if (result is { Canceled: false, Data: bool shouldUpdate })
            {
                if (shouldUpdate)
                {
                    // کاربر خواست آپدیت کنه
                    await AppVersionService.ApplyUpdateAsync(versionCheck.NewVersion);
                    
                    // رفرش صفحه
                    Navigation.NavigateTo(Navigation.Uri, forceLoad: true);
                }
                else
                {
                    // کاربر گفت بعداً (فقط وقتی force نیست)
                    await AppVersionService.SkipVersionAsync(versionCheck.NewVersion);
                }
            }
            else if (versionCheck.IsForceUpdate)
            {
                // اگر force بود و دیالوگ بسته شد، باز هم آپدیت کن
                await AppVersionService.ApplyUpdateAsync(versionCheck.NewVersion);
                Navigation.NavigateTo(Navigation.Uri, forceLoad: true);
            }
        }
        catch (Exception ex)
        {
            // در صورت خطا، لاگ کن ولی ادامه بده
            Console.WriteLine($"Error checking version: {ex.Message}");
        }
    }
}