<?php

namespace App\Livewire\Reports;

use App\Domain\Identity\Services\PermissionService;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

#[Layout('layouts.app')]
#[Title('التقارير')]
class ReportsHub extends Component
{
    public function mount(): void
    {
        $this->authorize('reports.view');
    }

    public function getReportsProperty(): array
    {
        return $this->withoutForbiddenReports($this->allReports());
    }

    /**
     * Drop the cards this user may not open.
     *
     * No permission means the card is not rendered at all, rather than
     * rendered and refused on click. The cross-branch reports are the only
     * ones gated so far — ReportViewer::CROSS_BRANCH_REPORTS is the shared
     * list, so the hub and the viewer cannot disagree about who may see them.
     */
    private function withoutForbiddenReports(array $categories): array
    {
        $user = auth()->user();

        if ($user && app(PermissionService::class)->can($user, config('branch_lock.permission'))) {
            return $categories;
        }

        foreach ($categories as $key => $category) {
            $category['reports'] = array_values(array_filter(
                $category['reports'],
                fn (array $report) => ! in_array($report['key'], ReportViewer::CROSS_BRANCH_REPORTS, true)
            ));

            if ($category['reports'] === []) {
                unset($categories[$key]);

                continue;
            }

            $categories[$key] = $category;
        }

        return $categories;
    }

    private function allReports(): array
    {
        return [
            'financial' => [
                'label' => 'مالي',
                'icon' => 'banknotes',
                'color' => 'emerald',
                'reports' => [
                    ['key' => 'daily_revenue', 'name' => 'الإيرادات اليومية', 'desc' => 'المبالغ المحصلة يومياً مع طريقة الدفع'],
                    ['key' => 'outstanding_balances', 'name' => 'الأرصدة المعلقة', 'desc' => 'فواتير غير مسددة بالكامل مع بيانات التواصل'],
                    ['key' => 'payment_methods', 'name' => 'طرق الدفع', 'desc' => 'توزيع المدفوعات حسب الطريقة (نقدي، بطاقة، محفظة)'],
                    ['key' => 'refunds', 'name' => 'المرتجعات', 'desc' => 'جميع عمليات الاسترداد مع السبب والمبلغ'],
                    ['key' => 'installments_due', 'name' => 'الأقساط المستحقة', 'desc' => 'أقساط قادمة أو متأخرة مع بيانات المشترك'],
                    ['key' => 'cash_sessions', 'name' => 'ملخص الورديات', 'desc' => 'كل وردية نقدية مع الفرق بين المتوقع والفعلي'],
                    ['key' => 'overdue_aging', 'name' => 'تقادم الفواتير', 'desc' => 'الفواتير المتأخرة مصنفة بالأيام (30/60/90+)'],
                    ['key' => 'revenue_by_activity', 'name' => 'الإيرادات حسب النشاط', 'desc' => 'مقارنة إيرادات كل نشاط رياضي'],
                    ['key' => 'expense_summary', 'name' => 'المصروفات', 'desc' => 'كل المصروفات النثرية حسب الفئة والتاريخ'],
                    ['key' => 'facility_rent_summary', 'name' => 'إيجارات المنشآت', 'desc' => 'دفعات الإيجار الشهرية لكل منشأة'],
                ],
            ],
            'participants' => [
                'label' => 'المشتركين',
                'icon' => 'users',
                'color' => 'blue',
                'reports' => [
                    ['key' => 'new_registrations', 'name' => 'التسجيلات الجديدة', 'desc' => 'المشتركون الجدد في الفترة المحددة'],
                    ['key' => 'by_status', 'name' => 'حسب الحالة', 'desc' => 'توزيع المشتركين (نشط، مجمد، موقوف...)'],
                    ['key' => 'by_age', 'name' => 'حسب الفئة العمرية', 'desc' => 'المشتركون النشطون مصنفين بالعمر'],
                    ['key' => 'by_gender', 'name' => 'حسب الجنس', 'desc' => 'عدد الذكور والإناث النشطين'],
                    ['key' => 'expired_memberships', 'name' => 'العضويات المنتهية', 'desc' => 'أعضاء تنتهي أو انتهت عضويتهم قريباً'],
                    ['key' => 'without_medical_clearance', 'name' => 'بدون شهادة طبية', 'desc' => 'مشتركون نشطون بدون شهادة طبية سارية'],
                    ['key' => 'frozen_suspended', 'name' => 'المجمدون والموقوفون', 'desc' => 'مشتركون متوقفون مع السبب والمدة'],
                ],
            ],
            'attendance' => [
                'label' => 'الحضور',
                'icon' => 'clipboard-check',
                'color' => 'amber',
                'reports' => [
                    ['key' => 'attendance_by_group', 'name' => 'الحضور حسب المجموعة', 'desc' => 'نسبة الحضور لكل مجموعة تدريبية'],
                    ['key' => 'absentees', 'name' => 'أكثر الغائبين', 'desc' => 'المشتركون الأكثر غياباً مع عدد المرات'],
                    ['key' => 'absent_by_trainer', 'name' => 'المتغيبون حسب المدرب', 'desc' => 'المتغيبون مجمعين بالمدرب مع فلتر عدد الحصص (يستثني الموقوفين)'],
                    ['key' => 'trainer_attendance', 'name' => 'حضور المدربين', 'desc' => 'نسبة حضور كل مدرب لحصصه'],
                ],
            ],
            'enrollments' => [
                'label' => 'التسجيلات',
                'icon' => 'academic-cap',
                'color' => 'purple',
                'reports' => [
                    ['key' => 'enrollments_by_program', 'name' => 'حسب البرنامج', 'desc' => 'عدد المسجلين في كل برنامج تدريبي'],
                    ['key' => 'group_capacity', 'name' => 'نسبة امتلاء المجموعات', 'desc' => 'المتاح مقابل الأقصى لكل مجموعة'],
                    ['key' => 'cancellations', 'name' => 'الإلغاءات', 'desc' => 'تسجيلات ملغاة مع السبب والتاريخ'],
                    ['key' => 'retention', 'name' => 'الاستمرارية', 'desc' => 'نسبة من استمر مقابل من ألغى'],
                ],
            ],
            'operations' => [
                'label' => 'العمليات',
                'icon' => 'cog',
                'color' => 'slate',
                'reports' => [
                    ['key' => 'session_completion', 'name' => 'الحصص المنجزة', 'desc' => 'حالات الحصص (مكتملة، ملغاة، مجدولة)'],
                    ['key' => 'branch_comparison', 'name' => 'مقارنة الفروع', 'desc' => 'مشتركون وإيرادات وتسجيلات لكل فرع'],
                    ['key' => 'trainer_workload', 'name' => 'عبء المدربين', 'desc' => 'عدد الحصص والمجموعات لكل مدرب'],
                    ['key' => 'wallet_balances', 'name' => 'أرصدة المحافظ', 'desc' => 'المشتركون أصحاب أرصدة محفظة إيجابية'],
                ],
            ],
            'inventory' => [
                'label' => 'المخزون',
                'icon' => 'cube',
                'color' => 'orange',
                'reports' => [
                    ['key' => 'low_stock', 'name' => 'المنتجات المنخفضة', 'desc' => 'منتجات وصلت أو تحت حد إعادة الطلب'],
                    ['key' => 'inventory_movements', 'name' => 'حركات المخزون', 'desc' => 'كل الحركات الواردة والصادرة'],
                    ['key' => 'product_sales', 'name' => 'مبيعات المنتجات', 'desc' => 'أكثر المنتجات مبيعاً بالكمية والإيراد'],
                    ['key' => 'pos_transactions', 'name' => 'عمليات نقاط البيع', 'desc' => 'تفاصيل كل عملية بيع'],
                    ['key' => 'pos_daily_summary', 'name' => 'ملخص POS اليومي', 'desc' => 'إجمالي المبيعات والخصومات يومياً'],
                ],
            ],
        ];
    }

    public function render()
    {
        return view('livewire.reports.reports-hub', [
            'categories' => $this->reports,
        ]);
    }
}
