<?php

declare(strict_types=1);

namespace App\Modules\Reporting\Application\Support;

final class ReportCatalog
{
    /** @var array<int,array<string,mixed>>|null */
    private static ?array $allCache = null;

    public static function groups(): array
    {
        return [
            'المبيعات','مرتجعات البيع','المشتريات','مرتجعات الشراء','المخزون','العملاء','الموردين','الخزائن','البنوك','الشيكات','المصروفات','الأرباح','الضرائب والخصومات','التشغيل والرقابة','الإدارة / Dashboard',
        ];
    }

    public static function all(): array
    {
        if (self::$allCache !== null) {
            return self::$allCache;
        }

        $r = [];
        $add = static function(string $group,string $slug,string $title,string $description,string $permission,string $url='',string $icon='fa-chart-simple',string $tags='') use (&$r): void {
            $base = $url !== '' ? $url : '/reports/generic/'.$slug;
            $r[] = [
                'group'=>$group,'slug'=>$slug,'title'=>$title,'description'=>$description,'icon'=>$icon,'url'=>$base,'permission'=>$permission,
                'print_url'=>$base.'/print','pdf_url'=>$base.'/pdf','excel_url'=>$base.'/export','tags'=>$tags ?: $title.' '.$group,
            ];
        };
        // Existing mature reports
        $add('العملاء','customer-statement','كشف حساب عميل','حركات العميل مع الرصيد والمدين والدائن خلال فترة محددة.','sales.statement.view','/reports/parties/customer-statement','fa-user-group','عميل كشف حساب مديونية تحصيل');
        $add('الموردين','supplier-statement','كشف حساب مورد','حركات المورد والمدفوعات والفواتير والرصيد الختامي.','suppliers.statement.view','/reports/parties/supplier-statement','fa-truck-field','مورد كشف حساب مشتريات سداد');
        $add('الموردين','supplier-aging','أعمار ديون الموردين','متابعة مديونيات الموردين حسب الفترات الزمنية.','suppliers.aging.view','/reports/parties/supplier-aging','fa-clock','اعمار ديون موردين');
        $add('المخزون','inventory-stock','تقرير أرصدة المخزون','أرصدة الأصناف وقيمة التكلفة حسب المخزن والفلاتر.','items.view','/reports/inventory/stock','fa-boxes-stacked','مخزون رصيد اصناف');
        $add('المخزون','item-movement','تقرير حركة صنف','تتبع وارد ومنصرف صنف خلال فترة محددة.','items.view','/reports/inventory/item-movement','fa-right-left','حركة صنف وارد منصرف');
        $add('المشتريات','purchases-period','تقرير المشتريات خلال فترة','تحليل فواتير الشراء خلال فترة.','purchases.reports.view','/reports/generic/purchases-period','fa-file-invoice-dollar','مشتريات فترة');
        $add('المشتريات','purchases-by-supplier','تقرير مشتريات الموردين','ملخص مشتريات كل مورد.','purchases.reports.view','/reports/generic/purchases-by-supplier','fa-truck','مشتريات مورد');
        $add('المشتريات','purchase-items','تقرير مشتريات الأصناف','تفاصيل شراء الأصناف والكميات والتكلفة.','purchases.reports.view','/reports/generic/purchase-items','fa-box-open','مشتريات اصناف');
        $add('المصروفات','expenses-period','تقرير المصروفات خلال فترة','تحليل المصروفات حسب الفترة والبنود.','expenses.report.view','/reports/generic/expenses-period','fa-receipt','مصروفات');
        $add('الأرباح','gross-profit','تقرير الربح الإجمالي خلال فترة','ملخص الربح والتكلفة والمبيعات.','expenses.report.view','/reports/generic/gross-profit','fa-chart-line','ارباح ربح مبيعات تكلفة');
        $add('البنوك','bank-balances','تقرير أرصدة البنوك','أرصدة الحسابات البنكية الحالية.','banks.accounts.view','/reports/generic/bank-balances','fa-building-columns','بنوك ارصدة');
        $add('البنوك','bank-statement','كشف حساب بنك','حركات حساب بنكي مع الرصيد.','banks.txns.view','/reports/generic/bank-statement','fa-money-check-dollar','بنك حركات كشف');

        // New generic report endpoints. They share a robust UI/export/print shell and reusable filtered datasets.
        foreach ([
            ['sales-period','تقرير المبيعات خلال فترة','فواتير البيع خلال فترة مع العميل والمخزن وطريقة السداد.'],['sales-customers','تقرير مبيعات العملاء','تجميع مبيعات العملاء.'],['sales-items','تقرير مبيعات الأصناف','تحليل كميات وقيم وربحية الأصناف المباعة.'],['sales-users','تقرير مبيعات المستخدمين / الكاشير','تجميع المبيعات حسب المستخدم.'],['sales-daily','تقرير المبيعات اليومية','تجميع المبيعات يوميًا.'],['sales-warehouses','تقرير المبيعات حسب المخزن','تجميع المبيعات حسب المخزن.'],['sales-payment-methods','تقرير المبيعات حسب طريقة الدفع','تجميع المبيعات حسب طريقة الدفع.'],['sales-unpaid','تقرير الفواتير غير المسددة','فواتير البيع ذات المتبقي.'],['sales-changes','تقرير الفواتير المعدلة أو الملغاة','متابعة الفواتير غير المنشورة أو الملغاة إن وجدت.'],['sales-discounts','تقرير خصومات المبيعات','تحليل خصومات فواتير البيع.'],
        ] as $x) $add('المبيعات',$x[0],$x[1],$x[2],'sales.invoices.view','','fa-cart-shopping');
        foreach ([['sales-returns-period','تقرير مرتجعات البيع خلال فترة','مرتجعات البيع خلال فترة.'],['sales-return-reasons','تقرير أسباب مرتجعات البيع','تحليل أسباب مرتجعات البيع.'],['most-returned-sales-items','تقرير أكثر الأصناف المرتجعة','أكثر الأصناف المرتجعة من العملاء.'],['customer-returns','تقرير مرتجعات العملاء','مرتجعات العملاء خلال فترة.'],['net-sales-after-returns','تقرير صافي المبيعات بعد المرتجعات','مقارنة المبيعات والمرتجعات والصافي.']] as $x) $add('مرتجعات البيع',$x[0],$x[1],$x[2],'sales.returns.view','','fa-rotate-left');
        foreach ([['purchase-price-changes','تقرير تغير أسعار الشراء','مقارنة أسعار شراء الأصناف.'],['purchase-unpaid','تقرير فواتير الشراء غير المسددة','فواتير الشراء ذات المتبقي.'],['purchases-warehouses','تقرير المشتريات حسب المخزن','تجميع المشتريات حسب المخزن.'],['purchases-users','تقرير المشتريات حسب المستخدم','تجميع المشتريات حسب المستخدم.']] as $x) $add('المشتريات',$x[0],$x[1],$x[2],'purchases.reports.view','','fa-cart-flatbed');
        foreach ([['purchase-returns-period','تقرير مرتجعات الشراء خلال فترة','مرتجعات الشراء خلال فترة.'],['supplier-returned-items','تقرير أكثر الأصناف المرتجعة للموردين','الأصناف الأكثر رجوعًا للموردين.'],['supplier-returns','تقرير مرتجعات الموردين','مرتجعات كل مورد.'],['net-purchases-after-returns','تقرير صافي المشتريات بعد المرتجعات','المشتريات ناقص مرتجعات الشراء.']] as $x) $add('مرتجعات الشراء',$x[0],$x[1],$x[2],'purchases.returns.view','','fa-rotate-right');
        foreach ([['stock-balances','تقرير أرصدة المخزون','أرصدة الأصناف الحالية حسب المخزن.'],['stock-movement','تقرير حركة صنف','حركة صنف محدد وارد ومنصرف ورصيد.'],['item-card','تقرير كارت صنف','كارت حركة صنف مع الوارد والمنصرف.'],['stock-by-warehouse','تقرير المخزون حسب المخزن','أرصدة المخزون مجمعة بالمخزن.'],['stock-by-supplier','تقرير أرصدة الأصناف حسب المورد','أرصدة وقيمة الأصناف مجمعة حسب المورد الافتراضي.'],['inactive-items','تقرير الأصناف الراكدة','أصناف لم تتحرك خلال فترة.'],['most-moving-items','تقرير الأصناف الأكثر حركة','أكثر الأصناف حركة.'],['reorder-items','تقرير الأصناف الناقصة / حد إعادة الطلب','أصناف أقل من حد الطلب.'],['negative-items','تقرير الأصناف السالبة','أصناف رصيدها سالب.'],['stock-adjustments','تقرير تسويات المخزون','حركات التسوية بالمخزون.'],['stock-transfers','تقرير تحويلات المخازن','تحويلات المخازن.'],['stock-cost-value','تقرير قيمة المخزون بالتكلفة','قيمة المخزون حسب التكلفة.'],['stock-sale-value','تقرير قيمة المخزون بسعر البيع','قيمة المخزون بسعر البيع.'],['stock-margin','تقرير فرق السعر بين التكلفة والبيع','هامش السعر بين التكلفة والبيع.']] as $x) $add('المخزون',$x[0],$x[1],$x[2],'items.view','','fa-boxes-stacked');
        foreach ([['customer-balances','تقرير أرصدة العملاء','أرصدة العملاء الحالية.'],['customer-aging','تقرير أعمار ديون العملاء','أعمار ديون العملاء.'],['late-customers','تقرير العملاء المتأخرين في السداد','عملاء عليهم متأخرات.'],['customer-activity','تقرير نشاط العملاء','نشاط وتعاملات العملاء.'],['inactive-customers','تقرير العملاء غير النشطين','عملاء بدون تعامل منذ فترة.'],['top-customers','تقرير أفضل العملاء','أفضل العملاء حسب المبيعات.'],['credit-limit','تقرير حد الائتمان','متابعة تجاوز حد الائتمان.']] as $x) $add('العملاء',$x[0],$x[1],$x[2],'sales.statement.view','','fa-user');
        foreach ([['supplier-balances','تقرير أرصدة الموردين','أرصدة الموردين الحالية.'],['supplier-debt-aging','تقرير أعمار ديون الموردين','أعمار ديون الموردين.'],['top-suppliers','تقرير الموردين الأكثر تعاملًا','أكثر الموردين تعاملًا.'],['supplier-item-prices','تقرير أسعار الموردين للأصناف','آخر أسعار الموردين للأصناف.'],['inactive-suppliers','تقرير الموردين غير النشطين','موردون بدون تعامل منذ فترة.']] as $x) $add('الموردين',$x[0],$x[1],$x[2],'suppliers.statement.view','','fa-truck');
        foreach ([['cashbox-ledger','تقرير حركة خزنة','حركات الخزائن.'],['cashbox-balances','تقرير أرصدة الخزائن','أرصدة الخزائن.'],['customer-collections','تقرير تحصيلات العملاء','تحصيلات العملاء.'],['supplier-payments','تقرير مدفوعات الموردين','مدفوعات الموردين.'],['cashbox-expenses','تقرير المصروفات من الخزنة','مصروفات الخزائن.'],['cashbox-transfers','تقرير تحويلات بين الخزائن','تحويلات الخزائن.'],['cashbox-daily','تقرير يومية الخزنة','يومية الخزنة.'],['cashbox-shortage-surplus','تقرير عجز/زيادة الخزنة','فروق الخزينة إن وجدت.']] as $x) $add('الخزائن',$x[0],$x[1],$x[2],'cashboxes.report.view','','fa-vault');
        foreach ([['bank-deposits','تقرير إيداعات البنوك','الإيداعات البنكية.'],['bank-withdrawals','تقرير مسحوبات البنوك','المسحوبات البنكية.'],['bank-cashbox-transfers','تقرير تحويلات بنك/خزنة','تحويلات بين بنك وخزنة.'],['bank-daily','تقرير يومية البنك','يومية الحساب البنكي.']] as $x) $add('البنوك',$x[0],$x[1],$x[2],'banks.txns.view','','fa-building-columns');
        foreach ([['received-checks','تقرير الشيكات المستلمة','الشيكات المستلمة.'],['issued-checks','تقرير الشيكات المسلمة','الشيكات المسلمة/المظهرة.'],['checks-due-today','تقرير الشيكات المستحقة اليوم','شيكات مستحقة اليوم.'],['checks-due-period','تقرير الشيكات المستحقة خلال فترة','شيكات مستحقة خلال فترة.'],['overdue-checks','تقرير الشيكات المتأخرة','شيكات تجاوزت تاريخ الاستحقاق.'],['returned-checks','تقرير الشيكات المرتجعة','شيكات مرتجعة.'],['check-lifecycle','تقرير دورة حياة الشيك','حالة وتاريخ الشيك.'],['checks-by-status','تقرير الشيكات حسب الحالة','تجميع الشيكات حسب الحالة.']] as $x) $add('الشيكات',$x[0],$x[1],$x[2],'checks.view','','fa-money-check');
        foreach ([['expenses-by-category','تقرير المصروفات حسب البند','المصروفات حسب البند/المجموعة.'],['expenses-by-user','تقرير المصروفات حسب المستخدم','المصروفات حسب المستخدم.'],['expenses-daily-monthly','تقرير المصروفات اليومية / الشهرية','تجميع المصروفات يومي أو شهري.'],['expenses-vs-sales','تقرير مقارنة المصروفات بالمبيعات','مقارنة المصروفات بالمبيعات.']] as $x) $add('المصروفات',$x[0],$x[1],$x[2],'expenses.report.view','','fa-receipt');
        foreach ([['item-profit','تقرير ربح الأصناف','ربحية الأصناف.'],['customer-profit','تقرير ربح العملاء','ربحية العملاء.'],['invoice-profit','تقرير ربح الفواتير','ربحية الفواتير.'],['warehouse-profit','تقرير ربح المخازن','ربحية المخازن.'],['profit-after-expenses','تقرير الربح بعد المصروفات','الربح بعد خصم المصروفات.'],['low-margin','تقرير هامش الربح المنخفض','الأصناف/الفواتير ذات هامش منخفض.']] as $x) $add('الأرباح',$x[0],$x[1],$x[2],'expenses.report.view','','fa-chart-line');
        foreach ([['sales-tax','تقرير ضريبة المبيعات','ضريبة المبيعات.'],['purchase-tax','تقرير ضريبة المشتريات','ضريبة المشتريات.'],['net-tax','تقرير صافي الضريبة','صافي ضريبة البيع والشراء.'],['discounts','تقرير الخصومات','خصومات البيع والشراء.'],['withholding-tax','تقرير خصم المنبع','خصم المنبع للمشتريات.']] as $x) $add('الضرائب والخصومات',$x[0],$x[1],$x[2],'expenses.report.view','','fa-percent');
        foreach ([['user-activity','تقرير نشاط المستخدمين','نشاط المستخدمين.'],['audit-log','تقرير سجل العمليات Audit Log','سجل العمليات.'],['sensitive-actions','تقرير العمليات الحساسة','عمليات الحذف والتعديل والإلغاء.'],['failed-logins','تقرير تسجيل الدخول الفاشل','محاولات الدخول الفاشلة.'],['user-permissions','تقرير صلاحيات المستخدمين','صلاحيات وأدوار المستخدمين.'],['price-changes','تقرير التعديلات على الأسعار','تغييرات أسعار الأصناف.'],['stock-changes','تقرير التعديلات على المخزون','تغييرات المخزون.']] as $x) $add('التشغيل والرقابة',$x[0],$x[1],$x[2],'admin.logs.view','','fa-shield-halved');
        foreach ([['daily-management-summary','ملخص يومي للإدارة','ملخص يومي للإدارة.'],['monthly-summary','ملخص شهري','ملخص شهري.'],['kpi','مؤشرات الأداء KPI','مؤشرات الأداء الرئيسية.'],['period-comparison','تقرير مقارنة فترات','مقارنة بين فترتين.'],['sales-growth','تقرير نمو المبيعات','نمو المبيعات حسب التجميع.']] as $x) $add('الإدارة / Dashboard',$x[0],$x[1],$x[2],'admin.dashboard.view','','fa-gauge-high');
        return self::$allCache = $r;
    }

    public static function find(string $slug): ?array
    {
        foreach (self::all() as $r) { if (($r['slug'] ?? '') === $slug) return $r; }
        return null;
    }
}
