<?php

namespace App\Livewire\Roles;

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

#[Layout('layouts.app')]
#[Title('مقارنة الأدوار')]
class RoleComparison extends Component
{
    public array $selectedRoleIds = [];
    public string $filterModule = '';
    public bool $showDifferencesOnly = false;

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

    public function addRole(int $roleId): void
    {
        if (count($this->selectedRoleIds) >= 4) {
            session()->flash('error', __('يمكنك مقارنة 4 أدوار كحد أقصى'));
            return;
        }
        if (!in_array($roleId, $this->selectedRoleIds)) {
            $this->selectedRoleIds[] = $roleId;
        }
    }

    public function removeRole(int $roleId): void
    {
        $this->selectedRoleIds = array_values(array_filter(
            $this->selectedRoleIds,
            fn ($id) => $id !== $roleId
        ));
    }

    public function toggleDifferencesOnly(): void
    {
        $this->showDifferencesOnly = !$this->showDifferencesOnly;
    }

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

        $selectedRoles = $allRoles->whereIn('id', $this->selectedRoleIds)->values();

        $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');

        $pivotData = [];
        if ($selectedRoles->isNotEmpty()) {
            $pivotData = DB::table('permission_role')
                ->whereIn('role_id', $selectedRoles->pluck('id'))
                ->get()
                ->groupBy('role_id')
                ->map(fn ($items) => $items->pluck('scope', 'permission_id')->toArray())
                ->toArray();
        }

        // Filter to differences only
        $filteredGrouped = $grouped;
        if ($this->showDifferencesOnly && $selectedRoles->count() >= 2) {
            $filteredGrouped = $grouped->map(function ($perms) use ($pivotData, $selectedRoles) {
                return $perms->filter(function ($perm) use ($pivotData, $selectedRoles) {
                    $scopes = $selectedRoles->map(fn ($r) => $pivotData[$r->id][$perm->id] ?? '')->toArray();
                    return count(array_unique($scopes)) > 1;
                });
            })->filter(fn ($perms) => $perms->isNotEmpty());
        }

        return view('livewire.roles.role-comparison', [
            'allRoles' => $allRoles,
            'selectedRoles' => $selectedRoles,
            'grouped' => $filteredGrouped,
            'modules' => $modules,
            'pivotData' => $pivotData,
            'moduleLabels' => $this->getModuleLabels(),
            'scopeLabels' => $this->getScopeLabels(),
        ]);
    }

    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' => 'نقل',
            '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' => 'إدارة القوالب',
            'assign_roles' => 'تعيين أدوار',
            'assign_permissions' => 'تعيين صلاحيات',
            default => $action,
        };
    }
}
