using Microsoft.AspNetCore.Components;
using MudBlazor;

namespace BackOffice.Pages.Role.Components;

public partial class RolePermissionsDialog
{
    [CascadingParameter]
    private IMudDialogInstance MudDialog { get; set; } = default!;

    [Parameter]
    public string RoleName { get; set; } = string.Empty;

    private readonly List<PermissionCategory> _categories = new();
    private readonly HashSet<string> _selectedPermissions = new(StringComparer.OrdinalIgnoreCase);

    protected override void OnInitialized()
    {
        base.OnInitialized();

        _categories.AddRange(GetPermissionCategories());

        // پیش‌انتخاب براساس RoleName (هم‌راستا با BFF RolePermissionConfig)
        if (string.Equals(RoleName, "SuperAdmin", StringComparison.OrdinalIgnoreCase))
        {
            foreach (var permission in _categories.SelectMany(c => c.Permissions))
            {
                _selectedPermissions.Add(permission.Key);
            }
        }
        else if (string.Equals(RoleName, "Admin", StringComparison.OrdinalIgnoreCase))
        {
            foreach (var permission in _categories.SelectMany(c => c.Permissions))
            {
                if (!permission.Key.StartsWith("settings.", StringComparison.OrdinalIgnoreCase))
                {
                    _selectedPermissions.Add(permission.Key);
                }
            }
        }
        else if (string.Equals(RoleName, "Inspector", StringComparison.OrdinalIgnoreCase))
        {
            foreach (var permission in _categories.SelectMany(c => c.Permissions))
            {
                if (permission.Key.EndsWith(".view", StringComparison.OrdinalIgnoreCase))
                {
                    _selectedPermissions.Add(permission.Key);
                }
            }
        }
    }

    private void OnPermissionChanged(bool isChecked, string permissionKey)
    {
        if (isChecked)
        {
            _selectedPermissions.Add(permissionKey);
        }
        else
        {
            _selectedPermissions.Remove(permissionKey);
        }
    }

    private Task SaveAsync()
    {
        // TODO: اتصال به API واقعی RBAC در BFF/CMS برای ذخیره RolePermissions
        MudDialog.Close(DialogResult.Ok(_selectedPermissions.ToList()));
        return Task.CompletedTask;
    }

    private void Cancel()
    {
        MudDialog.Cancel();
    }

    private static IEnumerable<PermissionCategory> GetPermissionCategories()
    {
        return new[]
        {
            new PermissionCategory(
                "orders",
                "سفارش‌ها",
                new[]
                {
                    new PermissionItem("orders.view", "مشاهده سفارش‌ها"),
                    new PermissionItem("orders.create", "ایجاد سفارش"),
                    new PermissionItem("orders.update", "ویرایش سفارش"),
                    new PermissionItem("orders.delete", "حذف سفارش"),
                    new PermissionItem("orders.cancel", "لغو سفارش"),
                    new PermissionItem("orders.approve", "تایید سفارش / عملیات حساس")
                }),
            new PermissionCategory(
                "products",
                "محصولات",
                new[]
                {
                    new PermissionItem("products.view", "مشاهده محصولات"),
                    new PermissionItem("products.create", "ایجاد محصول"),
                    new PermissionItem("products.update", "ویرایش محصول"),
                    new PermissionItem("products.delete", "حذف محصول")
                }),
            new PermissionCategory(
                "users",
                "کاربران",
                new[]
                {
                    new PermissionItem("users.view", "مشاهده کاربران"),
                    new PermissionItem("users.update", "ویرایش کاربران"),
                    new PermissionItem("users.delete", "حذف کاربران")
                }),
            new PermissionCategory(
                "commission",
                "کمیسیون و برداشت‌ها",
                new[]
                {
                    new PermissionItem("commission.view", "مشاهده گزارش‌های کمیسیون"),
                    new PermissionItem("commission.approve_withdrawal", "تایید درخواست برداشت")
                }),
            new PermissionCategory(
                "discountshop",
                "فروشگاه تخفیفی",
                new[]
                {
                    new PermissionItem("discountshop.manage", "مدیریت فروشگاه تخفیفی (محصولات/سفارش‌ها/گزارش فروش)")
                }),
            new PermissionCategory(
                "publicmessages",
                "پیام‌های عمومی",
                new[]
                {
                    new PermissionItem("publicmessages.view", "مشاهده پیام‌های عمومی"),
                    new PermissionItem("publicmessages.create", "ایجاد پیام عمومی"),
                    new PermissionItem("publicmessages.update", "ویرایش پیام عمومی"),
                    new PermissionItem("publicmessages.publish", "انتشار/بایگانی پیام‌ها")
                }),
            new PermissionCategory(
                "settings",
                "تنظیمات و سیستم",
                new[]
                {
                    new PermissionItem("settings.view", "مشاهده تنظیمات"),
                    new PermissionItem("settings.manage_configuration", "مدیریت تنظیمات سیستم"),
                    new PermissionItem("settings.manage_vat", "مدیریت تنظیمات VAT"),
                    new PermissionItem("system.alerts.view", "مشاهده هشدارهای سیستم"),
                    new PermissionItem("system.health.view", "مشاهده وضعیت سلامت سیستم")
                }),
            new PermissionCategory(
                "reports",
                "گزارش‌ها",
                new[]
                {
                    new PermissionItem("reports.view", "مشاهده گزارش‌ها")
                })
        };
    }

    private record PermissionCategory(string Key, string DisplayName, IReadOnlyList<PermissionItem> Permissions);

    private record PermissionItem(string Key, string DisplayName);
}

