@page "/public-messages"
@using BackOffice.Services.PublicMessage
@using BackOffice.Pages.PublicMessages.Components
@using static BackOffice.Pages.PublicMessages.Components.MessageFormDialog
@inject IPublicMessageService PublicMessageService
@inject IDialogService DialogService
@inject ISnackbar Snackbar

<PageTitle>مدیریت پیام‌های عمومی</PageTitle>

<div>
    <MudText Typo="Typo.h4" GutterBottom="true">
        <MudIcon Icon="@Icons.Material.Filled.Campaign" Class="ml-2" />
        مدیریت پیام‌های عمومی
    </MudText>
    
    <MudPaper Class="pa-4 mt-4">
        <MudGrid>
            <MudItem xs="12" sm="6" md="4">
                <MudTextField @bind-Value="_searchQuery" 
                              Label="جستجو" 
                              Variant="Variant.Outlined"
                              Adornment="Adornment.Start"
                              AdornmentIcon="@Icons.Material.Filled.Search"
                              OnKeyUp="@(() => OnSearch())" />
            </MudItem>
            <MudItem xs="12" sm="6" md="3">
                <MudSelect @bind-Value="_statusFilter" 
                           Label="وضعیت" 
                           Variant="Variant.Outlined"
                           T="MessageStatus?"
                           Clearable="true"
                           OnClearButtonClick="@(() => OnSearch())">
                    <MudSelectItem T="MessageStatus?" Value="@((MessageStatus?)null)">همه</MudSelectItem>
                    <MudSelectItem T="MessageStatus?" Value="@MessageStatus.Draft">پیش‌نویس</MudSelectItem>
                    <MudSelectItem T="MessageStatus?" Value="@MessageStatus.Published">منتشر شده</MudSelectItem>
                    <MudSelectItem T="MessageStatus?" Value="@MessageStatus.Archived">بایگانی شده</MudSelectItem>
                </MudSelect>
            </MudItem>
            <MudItem xs="12" sm="6" md="3">
                <MudSelect @bind-Value="_typeFilter" 
                           Label="نوع" 
                           Variant="Variant.Outlined"
                           T="MessageType?"
                           Clearable="true"
                           OnClearButtonClick="@(() => OnSearch())">
                    <MudSelectItem T="MessageType?" Value="@((MessageType?)null)">همه</MudSelectItem>
                    <MudSelectItem T="MessageType?" Value="@MessageType.Announcement">اطلاعیه</MudSelectItem>
                    <MudSelectItem T="MessageType?" Value="@MessageType.News">خبر</MudSelectItem>
                    <MudSelectItem T="MessageType?" Value="@MessageType.Alert">هشدار</MudSelectItem>
                    <MudSelectItem T="MessageType?" Value="@MessageType.Promotion">تبلیغات</MudSelectItem>
                </MudSelect>
            </MudItem>
            <MudItem xs="12" sm="6" md="2">
                <MudButton Variant="Variant.Filled" 
                           Color="Color.Primary" 
                           FullWidth="true"
                           StartIcon="@Icons.Material.Filled.Add"
                           OnClick="@(() => OpenCreateDialog())">
                    پیام جدید
                </MudButton>
            </MudItem>
            <MudItem xs="12" sm="6" md="2">
                <MudButton Variant="Variant.Outlined"
                           Color="Color.Secondary"
                           FullWidth="true"
                           StartIcon="@Icons.Material.Filled.ContentPasteGo"
                           OnClick="OpenTemplatesDialog">
                    قالب‌ها
                </MudButton>
            </MudItem>
        </MudGrid>

        <MudDataGrid @ref="_dataGrid" T="PublicMessageDto" 
                     Items="@_messages" 
                     Loading="@_loading"
                     Hover="true" 
                     Dense="true"
                     Class="mt-4">
            <Columns>
                <PropertyColumn Property="x => x.Id" Title="شناسه" />
                
                <PropertyColumn Property="x => x.Title" Title="عنوان" />
                
                <TemplateColumn Title="نوع">
                    <CellTemplate>
                        <MudChip T="string" Color="@GetTypeColor(context.Item.Type)" Size="Size.Small">
                            @context.Item.TypeName
                        </MudChip>
                    </CellTemplate>
                </TemplateColumn>
                
                <TemplateColumn Title="اولویت">
                    <CellTemplate>
                        <MudChip T="string" Color="Color.Secondary" Size="Size.Small">
                            @context.Item.PriorityName
                        </MudChip>
                    </CellTemplate>
                </TemplateColumn>
                
                <TemplateColumn Title="وضعیت">
                    <CellTemplate>
                        <MudChip T="string" Color="@GetStatusColor(context.Item.Status)" Size="Size.Small">
                            @context.Item.StatusName
                        </MudChip>
                    </CellTemplate>
                </TemplateColumn>
                
                <TemplateColumn Title="تاریخ شروع">
                    <CellTemplate>
                        @(context.Item.StartsAt?.MiladiToJalali() ?? "—")
                    </CellTemplate>
                </TemplateColumn>
                
                <TemplateColumn Title="تاریخ انقضا">
                    <CellTemplate>
                        @(context.Item.ExpiresAt?.MiladiToJalali() ?? "—")
                    </CellTemplate>
                </TemplateColumn>
                
                <TemplateColumn Title="ایجاد">
                    <CellTemplate>
                        @(context.Item.Created?.MiladiToJalali() ?? "—")
                    </CellTemplate>
                </TemplateColumn>
                
                <TemplateColumn Title="عملیات" Sortable="false">
                    <CellTemplate>
                        <MudMenu Icon="@Icons.Material.Filled.MoreVert" Size="Size.Small">
                            <MudMenuItem Icon="@Icons.Material.Filled.Visibility" 
                                         OnClick="@(() => ViewMessage(context.Item.Id))">
                                مشاهده
                            </MudMenuItem>
                            <MudMenuItem Icon="@Icons.Material.Filled.Edit" 
                                         OnClick="@(() => OpenEditDialog(context.Item.Id))">
                                ویرایش
                            </MudMenuItem>
                            @if (context.Item.Status == MessageStatus.Draft)
                            {
                                <MudMenuItem Icon="@Icons.Material.Filled.Publish" 
                                             OnClick="@(() => PublishMessage(context.Item.Id))">
                                    انتشار
                                </MudMenuItem>
                            }
                            @if (context.Item.Status == MessageStatus.Published)
                            {
                                <MudMenuItem Icon="@Icons.Material.Filled.Archive" 
                                             OnClick="@(() => ArchiveMessage(context.Item.Id))">
                                    بایگانی
                                </MudMenuItem>
                            }
                            <MudDivider />
                            <MudMenuItem Icon="@Icons.Material.Filled.Delete" 
                                         IconColor="Color.Error"
                                         OnClick="@(() => DeleteMessage(context.Item.Id))">
                                حذف
                            </MudMenuItem>
                        </MudMenu>
                    </CellTemplate>
                </TemplateColumn>
            </Columns>
            <NoRecordsContent>
                <MudAlert Severity="Severity.Info" Dense="true" Variant="Variant.Text" Class="my-4">موردی یافت نشد.</MudAlert>
            </NoRecordsContent>
            
            <PagerContent>
                <MudDataGridPager T="PublicMessageDto" PageSizeOptions="@(new int[] { 20, 50, 100 })"
                                  InfoFormat="سطر {first_item} تا {last_item} از {all_items}"
                                  RowsPerPageString="تعداد در صفحه" />
            </PagerContent>
        </MudDataGrid>
    </MudPaper>
</div>

@code {
    private MudDataGrid<PublicMessageDto>? _dataGrid;
    private List<PublicMessageDto> _messages = new();
    private bool _loading = false;
    
    private string? _searchQuery;
    private MessageStatus? _statusFilter;
    private MessageType? _typeFilter;

    private async Task OpenTemplatesDialog()
    {
        var options = new DialogOptions
        {
            CloseButton = true,
            MaxWidth = MaxWidth.Medium,
            FullWidth = true
        };

        await DialogService.ShowAsync<BackOffice.Pages.PublicMessages.Components.MessageTemplatesDialog>(
            "قالب‌های پیام",
            new DialogParameters(),
            options);
    }

    protected override async Task OnInitializedAsync()
    {
        await LoadMessages();
    }

    private async Task LoadMessages()
    {
        _loading = true;
        try
        {
            var filter = new MessageFilterDto
            {
                Status = _statusFilter,
                Type = _typeFilter
            };

            var (messages, totalCount) = await PublicMessageService.GetMessagesAsync(filter);
            _messages = messages;
            Snackbar.Add("پیام‌ها بارگذاری شدند", Severity.Success);
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در بارگذاری پیام‌ها: {ex.Message}", Severity.Error);
        }
        finally
        {
            _loading = false;
        }
    }

    private async Task OnSearch()
    {
        await LoadMessages();
    }

    private async Task OpenCreateDialog()
    {
        var model = new MessageFormModel();
        var parameters = new DialogParameters<MessageFormDialog>
        {
            { x => x.Model, model },
            { x => x.IsEditMode, false }
        };

        var options = new DialogOptions { MaxWidth = MaxWidth.Medium, FullWidth = true };
        var dialog = await DialogService.ShowAsync<MessageFormDialog>("ایجاد پیام جدید", parameters, options);
        var result = await dialog.Result;

        if (result is { Canceled: false, Data: MessageFormModel formData })
        {
            try
            {
                var dto = new CreatePublicMessageDto
                {
                    Title = formData.Title,
                    Content = formData.Content,
                    Type = formData.Type,
                    Priority = formData.Priority,
                    StartsAt = formData.StartsAt,
                    ExpiresAt = formData.ExpiresAt,
                    IsDismissible = formData.IsDismissible,
                    TargetAudience = formData.TargetAudience,
                    Tags = formData.Tags
                };

                await PublicMessageService.CreateAsync(dto);
                Snackbar.Add("پیام به صورت پیش‌نویس ذخیره شد", Severity.Success);
                await LoadMessages();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا در ایجاد پیام: {ex.Message}", Severity.Error);
            }
        }
    }

    private async Task OpenEditDialog(long messageId)
    {
        try
        {
            var message = await PublicMessageService.GetByIdAsync(messageId);
            if (message == null)
            {
                Snackbar.Add("پیام یافت نشد", Severity.Error);
                return;
            }

            var model = new MessageFormModel
            {
                Title = message.Title,
                Content = message.Content,
                Type = message.Type,
                Priority = message.Priority,
                StartsAt = message.StartsAt,
                ExpiresAt = message.ExpiresAt,
                IsDismissible = message.IsDismissible,
                TargetAudience = message.TargetAudience,
                Tags = message.Tags
            };

            var parameters = new DialogParameters<MessageFormDialog>
            {
                { x => x.Model, model },
                { x => x.IsEditMode, true }
            };

            var options = new DialogOptions { MaxWidth = MaxWidth.Medium, FullWidth = true };
            var dialog = await DialogService.ShowAsync<MessageFormDialog>("ویرایش پیام", parameters, options);
            var result = await dialog.Result;

            if (result is { Canceled: false, Data: MessageFormModel formData })
            {
                var dto = new UpdatePublicMessageDto
                {
                    Title = formData.Title,
                    Content = formData.Content,
                    Type = formData.Type,
                    Priority = formData.Priority,
                    StartsAt = formData.StartsAt,
                    ExpiresAt = formData.ExpiresAt,
                    IsDismissible = formData.IsDismissible,
                    TargetAudience = formData.TargetAudience,
                    Tags = formData.Tags
                };

                await PublicMessageService.UpdateAsync(messageId, dto);
                Snackbar.Add("پیام با موفقیت ویرایش شد", Severity.Success);
                await LoadMessages();
            }
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در ویرایش پیام: {ex.Message}", Severity.Error);
        }
    }

    private async Task ViewMessage(long messageId)
    {
        try
        {
            var message = await PublicMessageService.GetByIdAsync(messageId);
            if (message == null)
            {
                Snackbar.Add("پیام یافت نشد", Severity.Error);
                return;
            }

            var parameters = new DialogParameters<MessageViewDialog> { { x => x.Message, message } };
            var options = new DialogOptions { MaxWidth = MaxWidth.Large, FullWidth = true };
            await DialogService.ShowAsync<MessageViewDialog>("مشاهده پیام", parameters, options);
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در بارگذاری پیام: {ex.Message}", Severity.Error);
        }
    }

    private async Task PublishMessage(long messageId)
    {
        var result = await DialogService.ShowMessageBox(
            "تأیید انتشار",
            "آیا از انتشار این پیام اطمینان دارید؟",
            yesText: "بله", cancelText: "خیر");

        if (result == true)
        {
            try
            {
                await PublicMessageService.PublishAsync(messageId);
                Snackbar.Add("پیام با موفقیت منتشر شد", Severity.Success);
                await LoadMessages();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا در انتشار پیام: {ex.Message}", Severity.Error);
            }
        }
    }

    private async Task ArchiveMessage(long messageId)
    {
        try
        {
            await PublicMessageService.ArchiveAsync(messageId);
            Snackbar.Add("پیام بایگانی شد", Severity.Success);
            await LoadMessages();
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در بایگانی پیام: {ex.Message}", Severity.Error);
        }
    }

    private async Task DeleteMessage(long messageId)
    {
        var message = _messages.FirstOrDefault(m => m.Id == messageId);
        var result = await DialogService.ShowMessageBox(
            "تأیید حذف",
            $"آیا از حذف پیام «{message?.Title}» مطمئن هستید؟",
            yesText: "بله", cancelText: "خیر");

        if (result == true)
        {
            try
            {
                await PublicMessageService.DeleteAsync(messageId);
                Snackbar.Add("پیام با موفقیت حذف شد", Severity.Success);
                await LoadMessages();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا در حذف پیام: {ex.Message}", Severity.Error);
            }
        }
    }

    private Color GetTypeColor(MessageType type)
    {
        return type switch
        {
            MessageType.Announcement => Color.Primary,
            MessageType.News => Color.Info,
            MessageType.Alert => Color.Warning,
            MessageType.Promotion => Color.Success,
            _ => Color.Default
        };
    }

    private string GetTypeText(MessageType type)
    {
        return type switch
        {
            MessageType.Announcement => "اطلاعیه",
            MessageType.News => "خبر",
            MessageType.Alert => "هشدار",
            MessageType.Promotion => "تبلیغات",
            _ => "نامشخص"
        };
    }

    private Color GetStatusColor(MessageStatus status)
    {
        return status switch
        {
            MessageStatus.Draft => Color.Default,
            MessageStatus.Published => Color.Success,
            MessageStatus.Archived => Color.Dark,
            _ => Color.Default
        };
    }

    private string GetStatusText(MessageStatus status)
    {
        return status switch
        {
            MessageStatus.Draft => "پیش‌نویس",
            MessageStatus.Published => "منتشر شده",
            MessageStatus.Archived => "بایگانی شده",
            _ => "نامشخص"
        };
    }

}
