<?php

namespace App\Livewire\Roles;

use App\Domain\Identity\Models\Permission;
use App\Domain\Identity\Models\Role;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Layout('layouts.app')]
#[Title('مصفوفة الصلاحيات')]
class PermissionMatrix extends Component
{
    public string $filterModule = '';
    public string $filterRole = '';

    public function mount(): void
    {
        $this->authorize('roles.list');
    }

    public function togglePermission(int $roleId, int $permissionId, string $currentScope): void
    {
        $this->authorize('roles.assign_permissions');

        $role = Role::find($roleId);
        if (!$role) {
            return;
        }

        $actor = auth()->user();
        if (!$actor->is_super_admin && $role->level >= ($actor->primaryRole?->level ?? 0)) {
            session()->flash('error', __('لا يمكنك تعديل صلاحيات دور بمستوى أعلى من مستواك'));
            return;
        }

        $scopes = ['', 'own', 'own_groups', 'branch', 'academy', 'all'];
        $currentIndex = array_search($currentScope, $scopes);
        $nextIndex = ($currentIndex + 1) % count($scopes);
        $nextScope = $scopes[$nextIndex];

        if ($nextScope === '') {
            $role->permissions()->detach($permissionId);
        } else {
            $exists = DB::table('permission_role')
                ->where('role_id', $roleId)
                ->where('permission_id', $permissionId)
                ->exists();

            if ($exists) {
                DB::table('permission_role')
                    ->where('role_id', $roleId)
                    ->where('permission_id', $permissionId)
                    ->update(['scope' => $nextScope]);
            } else {
                DB::table('permission_role')->insert([
                    'role_id' => $roleId,
                    'permission_id' => $permissionId,
                    'scope' => $nextScope,
                    'created_at' => now(),
                ]);
            }
        }
    }

    public function render()
    {
        $roles = Role::where('academy_id', app('current_academy')->id)
            ->orderByDesc('level')
            ->get();

        $permissionsQuery = Permission::orderBy('module')->orderBy('action');
        if ($this->filterModule) {
            $permissionsQuery->where('module', $this->filterModule);
        }
        $permissions = $permissionsQuery->get();
        $grouped = $permissions->groupBy('module');

        $modules = Permission::distinct()->orderBy('module')->pluck('module');

        // Build pivot map: role_id => [permission_id => scope]
        $pivotData = DB::table('permission_role')
            ->whereIn('role_id', $roles->pluck('id'))
            ->get()
            ->groupBy('role_id')
            ->map(fn ($items) => $items->pluck('scope', 'permission_id')->toArray())
            ->toArray();

        if ($this->filterRole) {
            $roles = $roles->filter(fn ($r) => $r->slug === $this->filterRole)->values();
        }

        $actor = auth()->user();
        $canEdit = $actor->is_super_admin || Gate::allows('roles.assign_permissions');
        $canEditRole = $roles->mapWithKeys(fn ($r) => [
            $r->id => $canEdit && ($actor->is_super_admin || $r->level < ($actor->primaryRole?->level ?? 0))
        ])->toArray();

        return view('livewire.roles.permission-matrix', [
            'roles' => $roles,
            'grouped' => $grouped,
            'modules' => $modules,
            'pivotData' => $pivotData,
            'moduleLabels' => $this->getModuleLabels(),
            'scopeLabels' => $this->getScopeLabels(),
            'canEditRole' => $canEditRole,
        ]);
    }

    private function getModuleLabels(): array
    {
        return [
            'dashboard' => 'لوحة التحكم',
            'academies' => 'الأكاديمية',
            'branches' => 'الفروع',
            'users' => 'المستخدمين',
            'roles' => 'الأدوار',
            'people' => 'الأشخاص',
            'participants' => 'المشتركين',
            'guardians' => 'أولياء الأمور',
            'activities' => 'الأنشطة',
            'programs' => 'البرامج',
            'groups' => 'المجموعات',
            'sessions' => 'الحصص',
            'schedules' => 'الجداول',
            'enrollments' => 'التسجيلات',
            'holidays' => 'العطلات',
            'waitlists' => 'قوائم الانتظار',
            'attendance' => 'الحضور',
            'excuses' => 'الأعذار',
            'invoices' => 'الفواتير',
            'payments' => 'المدفوعات',
            'transactions' => 'المعاملات المالية',
            'accounts' => 'الحسابات',
            'wallets' => 'المحافظ',
            'payment_plans' => 'خطط الدفع',
            'cash_sessions' => 'ورديات الكاشير',
            'refunds' => 'المرتجعات',
            'daily_closing' => 'الإقفال اليومي',
            'expenses' => 'المصروفات',
            'pricing' => 'التسعير',
            'base_prices' => 'الأسعار الأساسية',
            'pricing_rules' => 'قواعد التسعير',
            'promotions' => 'العروض',
            'coupons' => 'الكوبونات',
            'pos' => 'نقطة البيع',
            'pos_sessions' => 'ورديات نقطة البيع',
            'products' => 'المنتجات',
            'categories' => 'التصنيفات',
            'warehouses' => 'المخازن',
            'inventory' => 'المخزون',
            'purchase_orders' => 'أوامر الشراء',
            'stock_counts' => 'جرد المخزون',
            'kits' => 'الأطقم',
            'suppliers' => 'الموردين',
            'facilities' => 'المنشآت',
            'reservations' => 'الحجوزات',
            'employees' => 'الموظفين',
            'trainers' => 'المدربين',
            'payroll' => 'الرواتب',
            'assignments' => 'التكليفات',
            'notifications' => 'الإشعارات',
            'notification_preferences' => 'إعدادات الإشعارات',
            'reports' => 'التقارير',
            'approvals' => 'الموافقات',
            'settings' => 'الإعدادات',
            'evaluations' => 'التقييمات',
            'documents' => 'المستندات',
            'audit' => 'سجل المراجعة',
            'super_admin' => 'مدير النظام',
            'events' => 'الفعاليات',
        ];
    }

    private function getScopeLabels(): array
    {
        return [
            'own' => 'الخاصة',
            'own_groups' => 'مجموعاته',
            'own_children' => 'أبنائه',
            'branch' => 'الفرع',
            'academy' => 'الأكاديمية',
            'all' => 'الكل',
        ];
    }

    public function getActionLabel(string $action): string
    {
        return match ($action) {
            'list' => 'عرض القائمة',
            'view' => 'عرض التفاصيل',
            'show' => 'عرض',
            'create' => 'إنشاء',
            'update' => 'تعديل',
            'delete' => 'حذف',
            'export' => 'تصدير',
            'import' => 'استيراد',
            'cancel' => 'إلغاء',
            'send' => 'إرسال',
            'manage' => 'إدارة',
            'mark' => 'تسجيل',
            'edit' => 'تحرير',
            'view_reports' => 'عرض التقارير',
            'submit' => 'تقديم',
            'approve' => 'موافقة',
            'reject' => 'رفض',
            'change_status' => 'تغيير الحالة',
            'view_financial' => 'عرض المالي',
            'view_attendance' => 'عرض الحضور',
            'bulk_status_change' => 'تغيير حالة جماعي',
            'manage_enrollments' => 'إدارة التسجيلات',
            'reschedule' => 'إعادة جدولة',
            'start' => 'بدء',
            'complete' => 'إكمال',
            'generate' => 'إنشاء تلقائي',
            'override' => 'تجاوز',
            'transfer' => 'نقل',
            'promote' => 'ترقية',
            'refund' => 'استرداد',
            'credit' => 'إيداع',
            'debit' => 'خصم',
            'freeze' => 'تجميد',
            'open' => 'فتح',
            'close' => 'إغلاق',
            'initiate' => 'بدء',
            'configure' => 'تهيئة',
            'access' => 'الوصول',
            'sell' => 'بيع',
            'override_price' => 'تجاوز السعر',
            'override_stock' => 'تجاوز المخزون',
            'void_transaction' => 'إلغاء عملية',
            'receive' => 'استلام',
            'adjust' => 'تسوية',
            'view_levels' => 'عرض المستويات',
            'manage_layouts' => 'إدارة التخطيطات',
            'manage_hours' => 'إدارة المواعيد',
            'confirm' => 'تأكيد',
            'manage_qualifications' => 'إدارة المؤهلات',
            'manage_availability' => 'إدارة التوفر',
            'view_compensation' => 'عرض المكافآت',
            'pay' => 'صرف',
            'manage_templates' => 'إدارة القوالب',
            'financial' => 'التقارير المالية',
            'attendance' => 'تقارير الحضور',
            'enrollment' => 'تقارير التسجيل',
            'inventory' => 'تقارير المخزون',
            'trainer' => 'تقارير المدربين',
            'facility' => 'تقارير المنشآت',
            'export_pdf' => 'تصدير PDF',
            'export_excel' => 'تصدير Excel',
            'view_audit_log' => 'عرض سجل المراجعة',
            'share' => 'مشاركة',
            'upload' => 'رفع',
            'merge' => 'دمج',
            'assign_roles' => 'تعيين أدوار',
            'assign_permissions' => 'تعيين صلاحيات',
            'deactivate' => 'إلغاء التفعيل',
            default => $action,
        };
    }
}
