<?php

namespace App\Support;

/**
 * رجیستری مرکزی نقش‌ها و دسترسی‌ها.
 *
 * هر «بخش» (section) معادل یک منبع یا صفحه‌ی پنل است و چند «توانایی» (ability) دارد:
 *   view       → مشاهده‌ی فهرست/رکورد
 *   create     → ایجاد
 *   update     → ویرایش
 *   delete     → حذف
 *   view_all   → مشاهده‌ی همه‌ی رکوردها (نه فقط رکوردهای خودِ کاربر)
 *   access     → دسترسی به صفحه (برای صفحه‌های بدون CRUD)
 *   print/export/convert → اکشن‌های ویژه‌ی فاکتور
 *
 * نام هر مجوز به‌صورت "{ability}_{section}" ساخته می‌شود؛ مثلاً view_customers.
 */
class AccessControl
{
    /**
     * تعریف همه‌ی بخش‌ها و توانایی‌های مجاز هر بخش.
     */
    public static function sections(): array
    {
        return [
            // ───────── CRM ─────────
            'customers' => [
                'label' => 'مشتریان',
                'group' => 'مدیریت مشتریان (CRM)',
                'abilities' => ['view', 'create', 'update', 'delete', 'view_all'],
            ],
            'tags' => [
                'label' => 'برچسب‌ها',
                'group' => 'مدیریت مشتریان (CRM)',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'message_templates' => [
                'label' => 'قالب‌های پیام',
                'group' => 'مدیریت مشتریان (CRM)',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'sales_pipeline' => [
                'label' => 'قیف فروش (کانبان)',
                'group' => 'مدیریت مشتریان (CRM)',
                'abilities' => ['access'],
            ],

            // ───────── فاکتورها ─────────
            'invoices' => [
                'label' => 'فاکتور و پیش‌فاکتور',
                'group' => 'فاکتورها',
                'abilities' => ['view', 'create', 'update', 'delete', 'view_all', 'print', 'export', 'convert'],
            ],
            'payments' => [
                'label' => 'پرداخت‌ها',
                'group' => 'فاکتورها',
                'abilities' => ['view', 'create', 'delete'],
            ],
            'products' => [
                'label' => 'کالا و خدمات',
                'group' => 'فاکتورها',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'companies' => [
                'label' => 'شرکت‌ها و سربرگ‌ها',
                'group' => 'فاکتورها',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'bank_accounts' => [
                'label' => 'شماره حساب‌های بانکی',
                'group' => 'فاکتورها',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],

            // ───────── پیمانکاران ─────────
            'contractors' => [
                'label' => 'پیمانکاران',
                'group' => 'پیمانکاران',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'task_finance' => [
                'label' => 'مالی تسک (اجرت/سود پیمانکار)',
                'group' => 'پیمانکاران',
                'abilities' => ['view', 'update'],
            ],

            // ───────── تسک‌ها ─────────
            'tasks' => [
                'label' => 'تسک‌ها و یادآوری‌ها',
                'group' => 'تسک‌ها و یادآوری‌ها',
                'abilities' => ['view', 'create', 'update', 'delete', 'view_all'],
            ],
            'task_calendar' => [
                'label' => 'تقویم تسک‌ها',
                'group' => 'تسک‌ها و یادآوری‌ها',
                'abilities' => ['access'],
            ],

            // ───────── مدیریت سیستم ─────────
            'users' => [
                'label' => 'کاربران و کارمندان',
                'group' => 'مدیریت سیستم',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'roles' => [
                'label' => 'نقش‌ها و سطوح دسترسی',
                'group' => 'مدیریت سیستم',
                'abilities' => ['access'],
            ],
            'settings' => [
                'label' => 'تنظیمات عمومی',
                'group' => 'مدیریت سیستم',
                'abilities' => ['access'],
            ],
            'invoice_settings' => [
                'label' => 'تنظیمات فاکتور',
                'group' => 'مدیریت سیستم',
                'abilities' => ['access'],
            ],
            'updates' => [
                'label' => 'به‌روزرسانی اسکریپت',
                'group' => 'مدیریت سیستم',
                'abilities' => ['access'],
            ],
            'sales_targets' => [
                'label' => 'هدف‌گذاری فروش',
                'group' => 'مدیریت سیستم',
                'abilities' => ['view', 'create', 'update', 'delete'],
            ],
            'login_logs' => [
                'label' => 'گزارش ورود و خروج',
                'group' => 'مدیریت سیستم',
                'abilities' => ['view'],
            ],
            'reports' => [
                'label' => 'داشبورد و گزارش‌های تحلیلی',
                'group' => 'مدیریت سیستم',
                'abilities' => ['view'],
            ],
            'chat' => [
                'label' => 'گفتگوی داخلی',
                'group' => 'مدیریت سیستم',
                'abilities' => ['access'],
            ],
        ];
    }

    /**
     * برچسب فارسی هر توانایی.
     */
    public static function abilityLabels(): array
    {
        return [
            'view' => 'مشاهده',
            'create' => 'ایجاد',
            'update' => 'ویرایش',
            'delete' => 'حذف',
            'view_all' => 'مشاهده همه (نه فقط موارد خود)',
            'access' => 'دسترسی',
            'print' => 'چاپ',
            'export' => 'خروجی اکسل',
            'convert' => 'تبدیل/کپی',
        ];
    }

    /**
     * تعریف نقش‌ها (سطوح مقام) و دسترسی هر نقش به‌صورت [section => [abilities]].
     * مقدار '*' یعنی همه‌ی توانایی‌های آن بخش.
     */
    public static function roles(): array
    {
        return [
            'admin' => [
                'label' => 'مدیر کل',
                'description' => 'دسترسی کامل به همه‌ی بخش‌ها بدون محدودیت.',
                'permissions' => '*', // همه‌چیز
            ],

            'sales_manager' => [
                'label' => 'مدیر فروش',
                'description' => 'مدیریت کامل CRM، فاکتورها و تسک‌ها؛ مشاهده‌ی همه‌ی رکوردها و گزارش‌ها.',
                'permissions' => [
                    'customers' => '*',
                    'tags' => '*',
                    'message_templates' => '*',
                    'sales_pipeline' => ['access'],
                    'invoices' => ['view', 'create', 'update', 'view_all', 'print', 'export', 'convert'],
                    'payments' => ['view', 'create'],
                    'products' => ['view', 'create', 'update'],
                    'companies' => ['view'],
                    'bank_accounts' => ['view'],
                    'contractors' => '*',
                    'task_finance' => '*',
                    'tasks' => '*',
                    'task_calendar' => ['access'],
                    'sales_targets' => ['view', 'create', 'update', 'delete'],
                    'users' => ['view'],
                    'reports' => ['view'],
                    'chat' => ['access'],
                ],
            ],

            'accountant' => [
                'label' => 'حسابدار',
                'description' => 'مدیریت کامل فاکتورها، پرداخت‌ها، کالا/خدمات، شرکت‌ها و حساب‌های بانکی.',
                'permissions' => [
                    'invoices' => ['view', 'create', 'update', 'delete', 'view_all', 'print', 'export', 'convert'],
                    'payments' => ['view', 'create', 'delete'],
                    'products' => '*',
                    'companies' => '*',
                    'bank_accounts' => '*',
                    'invoice_settings' => ['access'],
                    'customers' => ['view', 'view_all'],
                    'contractors' => ['view', 'create', 'update'],
                    'task_finance' => '*',
                    'tasks' => ['view', 'create', 'update'],
                    'task_calendar' => ['access'],
                    'sales_targets' => ['view'],
                    'reports' => ['view'],
                    'chat' => ['access'],
                ],
            ],

            'sales_agent' => [
                'label' => 'کارشناس فروش',
                'description' => 'مدیریت مشتریان و فاکتورهای خودش؛ بدون حذف و بدون دسترسی به بخش‌های مدیریتی.',
                'permissions' => [
                    'customers' => ['view', 'create', 'update'],
                    'tags' => ['view'],
                    'message_templates' => ['view'],
                    'sales_pipeline' => ['access'],
                    'invoices' => ['view', 'create', 'update', 'print', 'export'],
                    'payments' => ['view', 'create'],
                    'products' => ['view'],
                    'contractors' => ['view'],
                    'task_finance' => ['view', 'update'],
                    'tasks' => ['view', 'create', 'update'],
                    'task_calendar' => ['access'],
                    'reports' => ['view'],
                    'chat' => ['access'],
                ],
            ],

            'viewer' => [
                'label' => 'فقط مشاهده',
                'description' => 'مشاهده‌ی همه‌ی اطلاعات بدون امکان ایجاد، ویرایش یا حذف.',
                'permissions' => [
                    'customers' => ['view', 'view_all'],
                    'invoices' => ['view', 'view_all', 'print', 'export'],
                    'payments' => ['view'],
                    'products' => ['view'],
                    'companies' => ['view'],
                    'bank_accounts' => ['view'],
                    'contractors' => ['view'],
                    'task_finance' => ['view'],
                    'tasks' => ['view', 'view_all'],
                    'task_calendar' => ['access'],
                    'reports' => ['view'],
                    'chat' => ['access'],
                ],
            ],
        ];
    }

    /**
     * فهرست کامل نام همه‌ی مجوزها (برای ساخت در دیتابیس).
     *
     * @return string[]
     */
    public static function allPermissions(): array
    {
        $names = [];
        foreach (static::sections() as $key => $section) {
            foreach ($section['abilities'] as $ability) {
                $names[] = static::permissionName($ability, $key);
            }
        }

        return $names;
    }

    /**
     * نام مجوز از روی توانایی و بخش.
     */
    public static function permissionName(string $ability, string $section): string
    {
        return "{$ability}_{$section}";
    }

    /**
     * فهرست مجوزهای یک نقش بر اساس تعریف roles().
     *
     * @return string[]
     */
    public static function permissionsForRole(string $role): array
    {
        $def = static::roles()[$role] ?? null;
        if (! $def) {
            return [];
        }

        if ($def['permissions'] === '*') {
            return static::allPermissions();
        }

        $names = [];
        foreach ($def['permissions'] as $section => $abilities) {
            $available = static::sections()[$section]['abilities'] ?? [];
            $abilities = $abilities === '*' ? $available : $abilities;
            foreach ($abilities as $ability) {
                if (in_array($ability, $available, true)) {
                    $names[] = static::permissionName($ability, $section);
                }
            }
        }

        return $names;
    }

    /**
     * برچسب فارسی یک مجوز (مثلاً "مشاهده مشتریان").
     */
    public static function permissionLabel(string $name): string
    {
        foreach (static::sections() as $key => $section) {
            foreach ($section['abilities'] as $ability) {
                if (static::permissionName($ability, $key) === $name) {
                    $abilityLabel = static::abilityLabels()[$ability] ?? $ability;

                    return "{$abilityLabel} — {$section['label']}";
                }
            }
        }

        return $name;
    }

    /**
     * برچسب فارسی یک نقش.
     */
    public static function roleLabel(string $role): string
    {
        return static::roles()[$role]['label'] ?? $role;
    }
}
