using BackOffice.Services.Content;
using Microsoft.AspNetCore.Components;
using MudBlazor;

namespace BackOffice.Pages.Content.Components;

public partial class PageImagesDialog
{
    [CascadingParameter] IMudDialogInstance DialogInstance { get; set; } = default!;
    [Inject] public ISitePageSettingsService PageSettingsService { get; set; } = default!;

    [Parameter] public long PageId { get; set; }
    [Parameter] public string PageKey { get; set; } = string.Empty;
    [Parameter] public string PageTitle { get; set; } = string.Empty;
    [Parameter] public List<PageImageItemDto> Images { get; set; } = new();

    private bool _hasChanges;

    private async Task AddImage()
    {
        var dto = new SavePageImageDto
        {
            SitePageSettingsId = PageId,
            ImageGroup = GetDefaultImageGroup(),
            IsActive = true,
            SortOrder = Images.Count + 1
        };

        var parameters = new DialogParameters<PageImageEditDialog>
        {
            { nameof(PageImageEditDialog.Model), dto },
            { nameof(PageImageEditDialog.PageKey), PageKey },
            { nameof(PageImageEditDialog.IsNew), true }
        };

        var dialog = await DialogService.ShowAsync<PageImageEditDialog>(
            "افزودن تصویر", parameters,
            new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true });

        var result = await dialog.Result;
        if (result is { Canceled: false })
        {
            Snackbar.Add("تصویر با موفقیت اضافه شد", Severity.Success);
            _hasChanges = true;
            await ReloadImages();
        }
    }

    private async Task EditImage(PageImageItemDto item)
    {
        var dto = new SavePageImageDto
        {
            Id = item.Id,
            SitePageSettingsId = PageId,
            ImageGroup = item.ImageGroup,
            Title = item.Title,
            Subtitle = item.Subtitle,
            Description = item.Description,
            LinkUrl = item.LinkUrl,
            IconName = item.IconName,
            SortOrder = item.SortOrder,
            IsActive = item.IsActive
        };

        var parameters = new DialogParameters<PageImageEditDialog>
        {
            { nameof(PageImageEditDialog.Model), dto },
            { nameof(PageImageEditDialog.PageKey), PageKey },
            { nameof(PageImageEditDialog.IsNew), false },
            { nameof(PageImageEditDialog.ExistingImagePath), item.ImagePath }
        };

        var dialog = await DialogService.ShowAsync<PageImageEditDialog>(
            "ویرایش تصویر", parameters,
            new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true });

        var result = await dialog.Result;
        if (result is { Canceled: false })
        {
            Snackbar.Add("تصویر با موفقیت ویرایش شد", Severity.Success);
            _hasChanges = true;
            await ReloadImages();
        }
    }

    private async Task DeleteImage(PageImageItemDto item)
    {
        var confirm = await DialogService.ShowMessageBox(
            "تایید حذف",
            $"آیا از حذف تصویر «{item.Title ?? item.ImageGroup}» اطمینان دارید؟",
            yesText: "بله، حذف شود",
            cancelText: "انصراف");

        if (confirm != true) return;

        try
        {
            await PageSettingsService.DeleteImageAsync(item.Id);
            Snackbar.Add("تصویر با موفقیت حذف شد", Severity.Success);
            _hasChanges = true;
            await ReloadImages();
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در حذف تصویر: {ex.Message}", Severity.Error);
        }
    }

    private async Task ReloadImages()
    {
        var details = await PageSettingsService.GetByKeyAsync(PageKey);
        if (details != null)
        {
            Images = details.Images;
            StateHasChanged();
        }
    }

    private string GetDefaultImageGroup() => PageKey switch
    {
        "about" => "team",
        "licenses" => "licenses",
        _ => "values"
    };

    private void Close()
    {
        if (_hasChanges)
            DialogInstance.Close(DialogResult.Ok(true));
        else
            DialogInstance.Cancel();
    }
}
