<?php
declare(strict_types=1);

use App\Core\Registries\MenuRegistry;
use App\Core\Registries\PermissionRegistry;
use App\Core\EventBus;
use App\Modules\HR\Services\AttendanceViolationService;

// ────────────────────────────────────────────────────────────
// HR Module — Permissions (35 total)
// ────────────────────────────────────────────────────────────

PermissionRegistry::register('hr', [
    // Department
    'hr.department.view'          => ['ar' => 'عرض الأقسام والإدارات',        'en' => 'View Departments'],
    'hr.department.manage'        => ['ar' => 'إدارة الأقسام والإدارات',       'en' => 'Manage Departments'],

    // Job Title
    'hr.job_title.view'           => ['ar' => 'عرض المسميات الوظيفية',        'en' => 'View Job Titles'],
    'hr.job_title.manage'         => ['ar' => 'إدارة المسميات الوظيفية',       'en' => 'Manage Job Titles'],

    // Employee Profile
    'hr.employee.view'            => ['ar' => 'عرض بيانات الموظفين',          'en' => 'View Employee Profiles'],
    'hr.employee.manage'          => ['ar' => 'إدارة بيانات الموظفين',         'en' => 'Manage Employee Profiles'],
    'hr.employee.view_salary'     => ['ar' => 'عرض رواتب الموظفين',           'en' => 'View Employee Salaries'],
    'hr.employee.manage_salary'   => ['ar' => 'إدارة رواتب الموظفين',          'en' => 'Manage Employee Salaries'],

    // Contract
    'hr.contract.view'            => ['ar' => 'عرض العقود',                   'en' => 'View Contracts'],
    'hr.contract.manage'          => ['ar' => 'إدارة العقود',                  'en' => 'Manage Contracts'],

    // Attendance
    'hr.attendance.view'          => ['ar' => 'عرض الحضور والانصراف',          'en' => 'View Attendance'],
    'hr.attendance.manage'        => ['ar' => 'تسجيل الحضور والانصراف',        'en' => 'Manage Attendance'],
    'hr.attendance.approve'       => ['ar' => 'اعتماد سجلات الحضور',          'en' => 'Approve Attendance'],

    // Leave
    'hr.leave.view'               => ['ar' => 'عرض الإجازات',                 'en' => 'View Leaves'],
    'hr.leave.request'            => ['ar' => 'طلب إجازة',                    'en' => 'Request Leave'],
    'hr.leave.approve'            => ['ar' => 'اعتماد الإجازات',              'en' => 'Approve Leaves'],
    'hr.leave.manage'             => ['ar' => 'إدارة الإجازات والأرصدة',       'en' => 'Manage Leaves & Balances'],

    // Payroll
    'hr.payroll.view'             => ['ar' => 'عرض كشوف الرواتب',             'en' => 'View Payroll'],
    'hr.payroll.process'          => ['ar' => 'تشغيل كشوف الرواتب',           'en' => 'Process Payroll'],
    'hr.payroll.approve'          => ['ar' => 'اعتماد كشوف الرواتب',          'en' => 'Approve Payroll'],
    'hr.payslip.view_own'         => ['ar' => 'عرض مفردات الراتب الشخصي',     'en' => 'View Own Payslip'],

    // Insurance
    'hr.insurance.view'           => ['ar' => 'عرض سجلات التأمينات',          'en' => 'View Insurance Records'],
    'hr.insurance.manage'         => ['ar' => 'إدارة سجلات التأمينات',         'en' => 'Manage Insurance Records'],

    // Tax
    'hr.tax.view'                 => ['ar' => 'عرض سجلات الضرائب',            'en' => 'View Tax Records'],

    // Disciplinary
    'hr.disciplinary.view'        => ['ar' => 'عرض الإجراءات التأديبية',       'en' => 'View Disciplinary Actions'],
    'hr.disciplinary.manage'      => ['ar' => 'إدارة الإجراءات التأديبية',      'en' => 'Manage Disciplinary Actions'],

    // Loan
    'hr.loan.view'                => ['ar' => 'عرض السلف والقروض',            'en' => 'View Loans'],
    'hr.loan.manage'              => ['ar' => 'إدارة السلف والقروض',           'en' => 'Manage Loans'],
    'hr.loan.approve'             => ['ar' => 'اعتماد السلف والقروض',          'en' => 'Approve Loans'],

    // End of Service
    'hr.eos.view'                 => ['ar' => 'عرض مستحقات نهاية الخدمة',     'en' => 'View End of Service'],
    'hr.eos.manage'               => ['ar' => 'إدارة مستحقات نهاية الخدمة',    'en' => 'Manage End of Service'],
    'hr.eos.approve'              => ['ar' => 'اعتماد مستحقات نهاية الخدمة',   'en' => 'Approve End of Service'],

    // Performance
    'hr.performance.view'         => ['ar' => 'عرض تقييمات الأداء',           'en' => 'View Performance Reviews'],
    'hr.performance.manage'       => ['ar' => 'إدارة تقييمات الأداء',          'en' => 'Manage Performance Reviews'],

    // Document
    'hr.document.view'            => ['ar' => 'عرض مستندات الموظفين',         'en' => 'View Employee Documents'],
    'hr.document.manage'          => ['ar' => 'إدارة مستندات الموظفين',        'en' => 'Manage Employee Documents'],

    // Reports
    'hr.report.view'              => ['ar' => 'تقارير الموارد البشرية',        'en' => 'HR Reports'],

    // Holiday
    'hr.holiday.manage'           => ['ar' => 'إدارة العطلات الرسمية',         'en' => 'Manage Holidays'],

    // Schedule
    'hr.schedule.manage'          => ['ar' => 'إدارة جداول العمل',             'en' => 'Manage Work Schedules'],

    // Overtime
    'hr.overtime.view'            => ['ar' => 'عرض العمل الإضافي',             'en' => 'View Overtime'],
    'hr.overtime.create'          => ['ar' => 'تقديم طلب عمل إضافي',           'en' => 'Submit Overtime Request'],
    'hr.overtime.approve'         => ['ar' => 'اعتماد العمل الإضافي',           'en' => 'Approve Overtime'],
    'hr.overtime.manage'          => ['ar' => 'إدارة أنواع العمل الإضافي',       'en' => 'Manage Overtime Types'],

    // Shifts
    'hr.shifts.view'              => ['ar' => 'عرض الورديات',                  'en' => 'View Shifts'],
    'hr.shifts.manage'            => ['ar' => 'إدارة الورديات والتعيينات',       'en' => 'Manage Shifts & Assignments'],

    // Permission Requests (Hourly)
    'hr.permissions.view'         => ['ar' => 'عرض طلبات الأذونات',            'en' => 'View Permission Requests'],
    'hr.permissions.create'       => ['ar' => 'تقديم طلب إذن',                 'en' => 'Submit Permission Request'],
    'hr.permissions.approve'      => ['ar' => 'اعتماد طلبات الأذونات',          'en' => 'Approve Permission Requests'],
]);

// ────────────────────────────────────────────────────────────
// HR Module — Sidebar Menu
// ────────────────────────────────────────────────────────────

MenuRegistry::register('hr', [
    'label_ar'   => 'الموارد البشرية',
    'label_en'   => 'Human Resources',
    'icon'       => 'users',
    'route'      => '/hr/employees',
    'permission' => 'hr.employee.view',
    'parent'     => null,
    'order'      => 800,
    'children'   => [
        ['label_ar' => 'الموظفون',            'label_en' => 'Employees',           'route' => '/hr/employees',            'permission' => 'hr.employee.view',       'order' => 1],
        ['label_ar' => 'الأقسام والإدارات',   'label_en' => 'Departments',         'route' => '/hr/departments',          'permission' => 'hr.department.view',     'order' => 2],
        ['label_ar' => 'المسميات الوظيفية',   'label_en' => 'Job Titles',          'route' => '/hr/job-titles',           'permission' => 'hr.job_title.view',      'order' => 3],
        ['label_ar' => 'العقود',              'label_en' => 'Contracts',           'route' => '/hr/contracts',            'permission' => 'hr.contract.view',       'order' => 4],
        ['label_ar' => 'الهيكل الراتبي',      'label_en' => 'Salary Structures',   'route' => '/hr/salary-structures',    'permission' => 'hr.employee.view_salary','order' => 5],
        ['label_ar' => 'الحضور والانصراف',    'label_en' => 'Attendance',          'route' => '/hr/attendance',           'permission' => 'hr.attendance.view',     'order' => 6],
        ['label_ar' => 'الإجازات',            'label_en' => 'Leaves',              'route' => '/hr/leaves',               'permission' => 'hr.leave.view',          'order' => 7],
        ['label_ar' => 'كشوف الرواتب',        'label_en' => 'Payroll',             'route' => '/hr/payroll',              'permission' => 'hr.payroll.view',        'order' => 8],
        ['label_ar' => 'التأمينات الاجتماعية', 'label_en' => 'Social Insurance',   'route' => '/hr/insurance',            'permission' => 'hr.insurance.view',      'order' => 9],
        ['label_ar' => 'السلف والقروض',       'label_en' => 'Loans',               'route' => '/hr/loans',                'permission' => 'hr.loan.view',           'order' => 10],
        ['label_ar' => 'الإجراءات التأديبية', 'label_en' => 'Disciplinary',        'route' => '/hr/disciplinary',         'permission' => 'hr.disciplinary.view',   'order' => 11],
        ['label_ar' => 'نهاية الخدمة',        'label_en' => 'End of Service',      'route' => '/hr/end-of-service',       'permission' => 'hr.eos.view',            'order' => 12],
        ['label_ar' => 'تقييم الأداء',        'label_en' => 'Performance',         'route' => '/hr/performance',          'permission' => 'hr.performance.view',    'order' => 13],
        ['label_ar' => 'مستندات الموظفين',    'label_en' => 'Documents',           'route' => '/hr/documents',            'permission' => 'hr.document.view',       'order' => 14],
        ['label_ar' => 'العطلات الرسمية',     'label_en' => 'Holidays',            'route' => '/hr/holidays',             'permission' => 'hr.holiday.manage',      'order' => 15],
        ['label_ar' => 'جداول العمل',         'label_en' => 'Work Schedules',      'route' => '/hr/schedules',            'permission' => 'hr.schedule.manage',     'order' => 16],
        ['label_ar' => 'العمل الإضافي',       'label_en' => 'Overtime',            'route' => '/hr/overtime',             'permission' => 'hr.overtime.view',       'order' => 17],
        ['label_ar' => 'الورديات',            'label_en' => 'Shifts',              'route' => '/hr/shifts',               'permission' => 'hr.shifts.view',         'order' => 18],
        ['label_ar' => 'طلبات الأذونات',      'label_en' => 'Permissions',         'route' => '/hr/permissions',          'permission' => 'hr.permissions.view',    'order' => 19],
        ['label_ar' => 'المخالفات',           'label_en' => 'Violations',          'route' => '/hr/shifts/violations',    'permission' => 'hr.attendance.view',     'order' => 20],
        ['label_ar' => 'تقارير الموارد البشرية','label_en' => 'HR Reports',         'route' => '/hr/reports',              'permission' => 'hr.report.view',         'order' => 21],
    ],
]);

// ────────────────────────────────────────────────────────────
// HR Module — Event Listeners
// ────────────────────────────────────────────────────────────

// When a new employee is created in the system, prompt HR profile creation
EventBus::listen('employee.created', function (array $data): void {
    // Log that a new employee was created and needs an HR profile
    \App\Core\Logger::info('New employee created — HR profile needed', [
        'employee_id' => $data['id'] ?? null,
    ]);
});

// When an HR leave is approved, dispatch SMS notification
EventBus::listen('hr.leave.approved', function (array $data): void {
    if (!empty($data['employee_id'])) {
        \App\Core\EventBus::dispatch('sms.send', [
            'template_code' => 'hr_leave_approved',
            'employee_id'   => $data['employee_id'],
            'params'        => $data,
        ]);
    }
});

// When an HR leave is rejected, dispatch SMS notification
EventBus::listen('hr.leave.rejected', function (array $data): void {
    if (!empty($data['employee_id'])) {
        \App\Core\EventBus::dispatch('sms.send', [
            'template_code' => 'hr_leave_rejected',
            'employee_id'   => $data['employee_id'],
            'params'        => $data,
        ]);
    }
});

// When payroll is marked as paid, dispatch salary slip SMS
EventBus::listen('hr.payroll.paid', function (array $data): void {
    if (!empty($data['employee_id'])) {
        \App\Core\EventBus::dispatch('sms.send', [
            'template_code' => 'hr_salary_slip',
            'employee_id'   => $data['employee_id'],
            'params'        => $data,
        ]);
    }
});

// When a loan is approved, dispatch SMS notification
EventBus::listen('hr.loan.approved', function (array $data): void {
    if (!empty($data['employee_id'])) {
        EventBus::dispatch('sms.send', [
            'template_code' => 'hr_loan_approved',
            'employee_id'   => $data['employee_id'],
            'params'        => $data,
        ]);
    }
});

// ── Attendance Violation Auto-Detection ─────────────────────
// When attendance is recorded, auto-detect violations (late/early/absence)
EventBus::listen('hr.attendance.recorded', function (array $data): void {
    try {
        $date = $data['date'] ?? date('Y-m-d');
        AttendanceViolationService::detectViolations($date);
    } catch (\Throwable $e) {
        \App\Core\Logger::error('Attendance violation detection failed: ' . $e->getMessage());
    }
});
