<?php
declare(strict_types=1);

use App\Core\Database;

/**
 * HR System Configuration Keys
 *
 * All HR-specific configuration stored in system_config table.
 * Covers: Social Insurance (Law 148/2019), Income Tax (2024-2025 brackets),
 * Overtime (Art. 85), Leave rules, Discipline limits (Art. 58-68),
 * End of Service severance formula, and general HR settings.
 */
return function (Database $db): void {
    $ts = date('Y-m-d H:i:s');

    $configs = [
        // ── Social Insurance (Law 148/2019) ──
        [
            'config_key'   => 'hr.insurance.employee_basic_pct',
            'config_value' => '9.00',
            'description'  => 'نسبة اشتراك الموظف على الأجر الأساسي - Employee basic salary insurance percentage',
        ],
        [
            'config_key'   => 'hr.insurance.employee_variable_pct',
            'config_value' => '2.00',
            'description'  => 'نسبة اشتراك الموظف على الأجر المتغير - Employee variable salary insurance percentage',
        ],
        [
            'config_key'   => 'hr.insurance.employer_basic_pct',
            'config_value' => '12.00',
            'description'  => 'نسبة اشتراك صاحب العمل على الأجر الأساسي - Employer basic salary insurance percentage',
        ],
        [
            'config_key'   => 'hr.insurance.employer_variable_pct',
            'config_value' => '6.75',
            'description'  => 'نسبة اشتراك صاحب العمل على الأجر المتغير - Employer variable salary insurance percentage',
        ],
        [
            'config_key'   => 'hr.insurance.basic_salary_ceiling',
            'config_value' => '12600.00',
            'description'  => 'الحد الأقصى للأجر الأساسي للتأمينات (يتم تحديثه سنوياً) - Max insurable basic salary ceiling',
        ],
        [
            'config_key'   => 'hr.insurance.variable_salary_ceiling',
            'config_value' => '10900.00',
            'description'  => 'الحد الأقصى للأجر المتغير للتأمينات (يتم تحديثه سنوياً) - Max insurable variable salary ceiling',
        ],
        [
            'config_key'   => 'hr.insurance.basic_salary_floor',
            'config_value' => '2300.00',
            'description'  => 'الحد الأدنى للأجر الأساسي للتأمينات - Min insurable basic salary floor',
        ],
        [
            'config_key'   => 'hr.insurance.variable_salary_floor',
            'config_value' => '0.00',
            'description'  => 'الحد الأدنى للأجر المتغير للتأمينات - Min insurable variable salary floor',
        ],

        // ── Income Tax (2024-2025 Egyptian Tax Brackets) ──
        [
            'config_key'   => 'hr.tax.personal_exemption',
            'config_value' => '20000.00',
            'description'  => 'الإعفاء الشخصي السنوي - Annual personal tax exemption (EGP)',
        ],
        [
            'config_key'   => 'hr.tax.brackets_json',
            'config_value' => json_encode([
                ['from' =>       0, 'to' =>   40000, 'rate' =>  0.00],
                ['from' =>   40000, 'to' =>   55000, 'rate' => 10.00],
                ['from' =>   55000, 'to' =>   70000, 'rate' => 15.00],
                ['from' =>   70000, 'to' =>  200000, 'rate' => 20.00],
                ['from' =>  200000, 'to' =>  400000, 'rate' => 22.50],
                ['from' =>  400000, 'to' => 1200000, 'rate' => 25.00],
                ['from' => 1200000, 'to' =>       0, 'rate' => 27.50],
            ]),
            'description'  => 'شرائح ضريبة الدخل السنوية (JSON) - Annual income tax brackets',
        ],

        // ── Overtime (Art. 85) ──
        [
            'config_key'   => 'hr.overtime.day_rate_multiplier',
            'config_value' => '1.35',
            'description'  => 'معامل أجر الساعة الإضافية نهاراً (135%) - Day overtime multiplier per Art. 85',
        ],
        [
            'config_key'   => 'hr.overtime.night_rate_multiplier',
            'config_value' => '1.70',
            'description'  => 'معامل أجر الساعة الإضافية ليلاً (170%) - Night overtime multiplier per Art. 85',
        ],
        [
            'config_key'   => 'hr.overtime.night_start_hour',
            'config_value' => '19',
            'description'  => 'بداية فترة الليل (7 مساءً) - Night period start hour (24h format)',
        ],
        [
            'config_key'   => 'hr.overtime.night_end_hour',
            'config_value' => '7',
            'description'  => 'نهاية فترة الليل (7 صباحاً) - Night period end hour (24h format)',
        ],

        // ── Working Hours (Art. 80-85) ──
        [
            'config_key'   => 'hr.working_hours.standard_per_day',
            'config_value' => '8',
            'description'  => 'ساعات العمل اليومية القياسية - Standard working hours per day',
        ],
        [
            'config_key'   => 'hr.working_hours.standard_per_week',
            'config_value' => '48',
            'description'  => 'ساعات العمل الأسبوعية القياسية - Standard working hours per week',
        ],
        [
            'config_key'   => 'hr.working_hours.ramadan_per_day',
            'config_value' => '7',
            'description'  => 'ساعات العمل اليومية في رمضان للمسلمين - Ramadan working hours per day',
        ],
        [
            'config_key'   => 'hr.working_hours.night_shift_per_day',
            'config_value' => '7',
            'description'  => 'ساعات العمل اليومية للورديات الليلية - Night shift working hours per day',
        ],

        // ── Discipline Limits (Art. 58-68) ──
        [
            'config_key'   => 'hr.discipline.max_wage_deduction_days_per_month',
            'config_value' => '5',
            'description'  => 'الحد الأقصى لأيام الخصم من الراتب شهرياً (مادة 58) - Max wage deduction days per month',
        ],
        [
            'config_key'   => 'hr.discipline.max_suspension_days_per_month',
            'config_value' => '6',
            'description'  => 'الحد الأقصى لأيام الإيقاف عن العمل شهرياً - Max suspension days per month',
        ],
        [
            'config_key'   => 'hr.discipline.appeal_window_days',
            'config_value' => '7',
            'description'  => 'مهلة التظلم من العقوبة التأديبية (بالأيام) - Appeal window in days after penalty',
        ],
        [
            'config_key'   => 'hr.discipline.investigation_required',
            'config_value' => '1',
            'description'  => 'إلزامية التحقيق قبل توقيع العقوبة - Investigation required before penalty',
        ],

        // ── End of Service / Severance ──
        [
            'config_key'   => 'hr.eos.severance_first_5y_multiplier',
            'config_value' => '0.5',
            'description'  => 'معامل مكافأة نهاية الخدمة لأول 5 سنوات (نصف شهر/سنة) - Severance multiplier first 5 years',
        ],
        [
            'config_key'   => 'hr.eos.severance_after_5y_multiplier',
            'config_value' => '1.0',
            'description'  => 'معامل مكافأة نهاية الخدمة بعد 5 سنوات (شهر/سنة) - Severance multiplier after 5 years',
        ],
        [
            'config_key'   => 'hr.eos.notice_period_under_10y_months',
            'config_value' => '2',
            'description'  => 'فترة الإنذار للموظف بخدمة أقل من 10 سنوات (بالأشهر) - Notice period < 10 years service',
        ],
        [
            'config_key'   => 'hr.eos.notice_period_gte_10y_months',
            'config_value' => '3',
            'description'  => 'فترة الإنذار للموظف بخدمة 10 سنوات فأكثر (بالأشهر) - Notice period >= 10 years service',
        ],

        // ── Leave Rules ──
        [
            'config_key'   => 'hr.leave.annual_under_10y',
            'config_value' => '21',
            'description'  => 'أيام الإجازة السنوية (خدمة أقل من 10 سنوات) - Annual leave days < 10 years service',
        ],
        [
            'config_key'   => 'hr.leave.annual_gte_10y',
            'config_value' => '30',
            'description'  => 'أيام الإجازة السنوية (خدمة 10 سنوات فأكثر أو عمر 50+) - Annual leave days >= 10 years or age 50+',
        ],
        [
            'config_key'   => 'hr.leave.annual_hazardous',
            'config_value' => '45',
            'description'  => 'أيام الإجازة السنوية (أعمال خطرة أو مناطق نائية) - Annual leave for hazardous/remote work',
        ],
        [
            'config_key'   => 'hr.leave.min_consecutive_annual',
            'config_value' => '6',
            'description'  => 'الحد الأدنى للإجازة السنوية المتصلة - Min consecutive annual leave days per year',
        ],
        [
            'config_key'   => 'hr.leave.carry_over_max_years',
            'config_value' => '3',
            'description'  => 'الحد الأقصى لسنوات ترحيل الإجازات - Max carry-over accumulation years',
        ],

        // ── Probation (Art. 33) ──
        [
            'config_key'   => 'hr.probation.max_months',
            'config_value' => '3',
            'description'  => 'الحد الأقصى لفترة الاختبار (بالأشهر) (مادة 33) - Max probation period in months',
        ],

        // ── Ramadan Configuration ──
        [
            'config_key'   => 'hr.ramadan.start_date',
            'config_value' => '',
            'description'  => 'تاريخ بداية رمضان (يُحدّث سنوياً) YYYY-MM-DD - Ramadan start date (updated yearly)',
        ],
        [
            'config_key'   => 'hr.ramadan.end_date',
            'config_value' => '',
            'description'  => 'تاريخ نهاية رمضان (يُحدّث سنوياً) YYYY-MM-DD - Ramadan end date (updated yearly)',
        ],

        // ── Payroll ──
        [
            'config_key'   => 'hr.payroll.payment_day',
            'config_value' => '27',
            'description'  => 'يوم صرف الرواتب الشهري - Monthly salary payment day',
        ],
        [
            'config_key'   => 'hr.payroll.currency',
            'config_value' => 'EGP',
            'description'  => 'عملة الرواتب - Payroll currency code',
        ],
    ];

    foreach ($configs as $cfg) {
        $existing = $db->selectOne(
            "SELECT id FROM system_config WHERE config_key = ?",
            [$cfg['config_key']]
        );
        if ($existing) {
            continue;
        }
        $db->insert('system_config', [
            'config_key'    => $cfg['config_key'],
            'config_value'  => $cfg['config_value'],
            'config_type'   => is_numeric($cfg['config_value']) ? (str_contains($cfg['config_value'], '.') ? 'float' : 'integer') : (str_starts_with($cfg['config_value'], '[') ? 'json' : 'string'),
            'group_name'    => 'hr',
            'description_ar' => $cfg['description'],
            'is_editable'   => 1,
            'created_at'    => $ts,
            'updated_at'    => $ts,
        ]);
    }
};
