<?php

declare(strict_types=1);

namespace App\Services;

/**
 * Approved DIAR report catalogue.
 *
 * The latest approved workbook is treated as the immutable golden-master
 * structure for DIAR-6B.5. Its historical values are sample evidence only;
 * report outputs must use the selected frozen snapshot and hospital scope.
 */
final class DiarReportCatalog
{
    public const APPROVED_WORKBOOK_SHA256 = '7af5da46586983abe8c2e7807d82ad64454b7794f7d6da677ba232da0fd39560';

    /** @return array<string,mixed> */
    public static function approvedWorkbook(): array
    {
        return [
            'display_name' => 'Approved HMH DIAR Review Report',
            'reference_filename' => 'MNH_Review_Report_APPROVED.xlsx',
            'sha256' => self::APPROVED_WORKBOOK_SHA256,
            'sheet_count' => 12,
            'status' => 'APPROVED',
            'binding' => 'FROZEN_SNAPSHOT',
            'data_note_en' => 'The workbook layout, sheet order, management wording, interpretation controls and visual hierarchy are approved. Historical values in the reference file are not copied into new exports.',
            'data_note_ar' => 'تم اعتماد تخطيط المصنف وترتيب الأوراق وصياغة الإدارة وحدود التفسير والتسلسل البصري. ولا تُنسخ القيم التاريخية الموجودة في الملف المرجعي إلى التصديرات الجديدة.',
        ];
    }

    /** @return array<int,array<string,mixed>> */
    public static function sheets(): array
    {
        return [
            self::sheet(1, 'summary', 'Summary', 'الملخص', 'A1:L77', 1, null, 12,
                'Executive summary, management interpretation, recommended actions, charts and leading stores/movement types.',
                'ملخص تنفيذي وتفسير إداري وإجراءات مقترحة ورسوم وأعلى المخازن وأنواع الحركات.',
                ['Cases Requiring Review', 'Critical Cases', 'High-Priority Cases', 'Medium-Priority Cases', 'Total Cost Value', 'Management Interpretation']),
            self::sheet(2, 'daily_distribution', 'Daily Distribution', 'التوزيع اليومي', 'A1:S34', 1, 4, 19,
                'Daily review volume, priority mix, reference coverage, mass-event indicators and inventory-cost value.',
                'حجم المراجعة اليومي ومزيج الأولويات وتغطية المرجع ومؤشرات الأحداث الجماعية والقيمة بتكلفة المخزون.',
                ['Date', 'Movement Groups Reviewed', 'Cases Requiring Review', 'Critical', 'High', 'Medium', 'Cost Value (SAR)', 'Operational Note']),
            self::sheet(3, 'critical_cases', 'Critical Cases', 'الحالات الحرجة', 'A1:T133', 1, 4, 20,
                'Urgent cases ranked by operational and financial review priority.',
                'الحالات العاجلة مرتبة حسب أولوية المراجعة التشغيلية والمالية.',
                ['Rank', 'Case ID', 'Date', 'Score', 'Store', 'Item', 'Movement Type', 'Case Value at Inventory Cost (SAR)', 'Recommended Action']),
            self::sheet(4, 'all_cases', 'All Cases', 'جميع الحالات', 'A1:Z584', 1, 4, 26,
                'Complete review register including the management follow-up fields reserved in the approved workbook.',
                'سجل المراجعة الكامل ويشمل حقول المتابعة الإدارية المحجوزة في المصنف المعتمد.',
                ['Rank', 'Case ID', 'Date', 'Priority', 'Score', 'Store', 'Item', 'Case Value at Inventory Cost (SAR)', 'Associated Users', 'Review Status', 'Review Owner', 'Review Result', 'Management Notes'],
                ['Review Status', 'Review Owner', 'Review Result', 'Management Notes']),
            self::sheet(5, 'movement_details', 'Movement Details', 'تفاصيل الحركات', 'A1:W1360', 1, 4, 23,
                'Movement-line evidence linked to each case, document, user, quantity and cost recorded at movement time.',
                'أدلة سطور الحركات المرتبطة بكل حالة ومستند ومستخدم وكمية وتكلفة مسجلة وقت الحركة.',
                ['Case ID', 'Movement Number', 'Line Number', 'Document Number', 'Movement Date & Time', 'User ID', 'Line Quantity', 'Unit Cost (SAR)', 'Line Value at Inventory Cost (SAR)']),
            self::sheet(6, 'store_analysis', 'Store Analysis', 'تحليل المخازن', 'A1:M14', 1, 4, 13,
                'Case concentration, priority mix, cost, quantity, items and users by store.',
                'تركيز الحالات ومزيج الأولويات والتكلفة والكمية والأصناف والمستخدمون حسب المخزن.',
                ['Store Code', 'Store', 'Cases', 'Critical', 'High', 'Medium', 'Share', 'Cost Value (SAR)', 'Items', 'Users', 'Dominant Movement']),
            self::sheet(7, 'movement_type_analysis', 'Movement Type Analysis', 'تحليل أنواع الحركات', 'A1:L12', 1, 4, 12,
                'Case concentration and inventory-cost value by governed movement type and direction.',
                'تركيز الحالات وقيمة تكلفة المخزون حسب نوع الحركة المحكوم والاتجاه.',
                ['Movement Code', 'Movement Type', 'Direction', 'Cases', 'Critical', 'High', 'Medium', 'Share', 'Cost Value (SAR)', 'Cases Linked to Mass Event']),
            self::sheet(8, 'item_analysis', 'Item Analysis', 'تحليل الأصناف', 'A1:M247', 1, 4, 13,
                'Items ranked by case count, priority, store breadth, quantity and inventory-cost value.',
                'الأصناف مرتبة حسب عدد الحالات والأولوية وانتشار المخازن والكمية وقيمة تكلفة المخزون.',
                ['Item Code', 'Item', 'Cases', 'Critical', 'High', 'Medium', 'Stores', 'Movement Types', 'Quantity', 'Cost Value (SAR)', 'Highest Score']),
            self::sheet(9, 'user_associations', 'User Associations', 'ارتباطات المستخدمين', 'A1:K48', 1, 4, 11,
                'Users associated with source movements for traceability; appearance does not imply responsibility or misconduct.',
                'المستخدمون المرتبطون بحركات المصدر لأغراض التتبع؛ ولا يعني الظهور مسؤولية أو مخالفة.',
                ['User', 'Unique Cases', 'Critical', 'High', 'Medium', 'Movement Lines', 'Line Value at Inventory Cost (SAR)', 'Stores', 'Items']),
            self::sheet(10, 'statistical_basis', 'Statistical Basis', 'الأساس الإحصائي', 'A1:J53', 1, 17, 10,
                'Plain-language explanation of the 365-day comparison, coverage and indicator interpretation.',
                'شرح مبسط لمقارنة 365 يومًا والتغطية وتفسير المؤشرات.',
                ['Indicator', 'Management Meaning', 'Above Typical Upper Limit', 'Above Exceptional Limit', 'Above Historical Maximum', 'Interpretation']),
            self::sheet(11, 'statistical_comparisons', 'Statistical Comparisons', 'المقارنات الإحصائية', 'A1:AH584', 1, 4, 34,
                'Observed values compared with the preceding 365-day baseline, P95, P99 and historical maximum.',
                'القيم المرصودة مقارنة بخط أساس 365 يومًا وP95 وP99 والحد الأقصى التاريخي.',
                ['Case ID', 'Observed Quantity', 'Typical Quantity', 'P95 Quantity', 'P99 Quantity', 'Historical Maximum Quantity', 'Observed Cost Value', 'Observed Transactions', 'Observed Largest Movement', 'Days Since Last Similar Activity']),
            self::sheet(12, 'methodology_controls', 'Methodology & Controls', 'المنهجية والضوابط', 'A1:B22', 1, 8, 2,
                'Scope, exclusions, financial-value definitions, interpretation boundaries and management usage guidance.',
                'النطاق والاستبعادات وتعريفات القيم المالية وحدود التفسير وإرشادات الاستخدام الإداري.',
                ['Report Scope', 'Review Period', 'Reference Period', 'Item Scope', 'Excluded Stores', 'Comparison Method', 'Financial Values', 'Meaning of Total Value', 'Users', 'How to Use the Results']),
        ];
    }

    /** @return array<string,mixed> */
    private static function sheet(
        int $order,
        string $code,
        string $nameEn,
        string $nameAr,
        string $approvedDimension,
        int $titleRow,
        ?int $headerRow,
        int $approvedColumnCount,
        string $purposeEn,
        string $purposeAr,
        array $keyColumns,
        array $managementFields = []
    ): array {
        return [
            'order' => $order,
            'code' => $code,
            'name_en' => $nameEn,
            'name_ar' => $nameAr,
            'approved_dimension' => $approvedDimension,
            'title_row' => $titleRow,
            'header_row' => $headerRow,
            'approved_column_count' => $approvedColumnCount,
            'purpose_en' => $purposeEn,
            'purpose_ar' => $purposeAr,
            'key_columns' => $keyColumns,
            'management_fields' => $managementFields,
            'preview_status' => 'AVAILABLE',
            'export_status' => 'ENABLED',
        ];
    }

    /** @return array<int,string> */
    public static function exactSheetOrder(): array
    {
        return array_values(array_map(static fn(array $sheet): string => (string)$sheet['name_en'], self::sheets()));
    }
}
