<?php

namespace App\Services\Reports;

use App\Models\User;

class ReportCatalog
{
    /**
     * @return list<array{key: string, title: string, description: string, permission: string|list<string>, route: string, export_route: ?string, module: string}>
     */
    public function availableForUser(?User $user): array
    {
        if (! $user) {
            return [];
        }

        $reports = [
            [
                'key' => 'attendance',
                'title' => 'Attendance Reports',
                'description' => 'Date range, department and employee filters, CSV export.',
                'permission' => 'attendances_view',
                'route' => 'attendance.reports',
                'export_route' => null,
                'module' => 'attendance',
            ],
            [
                'key' => 'payroll',
                'title' => 'Payroll',
                'description' => 'Monthly payroll cycles, payslips, summary CSV and bank file export.',
                'permission' => 'payrolls_view',
                'route' => 'payroll.index',
                'route_params' => ['tab' => 'run'],
                'export_route' => null,
                'module' => 'payroll',
            ],
            [
                'key' => 'employees',
                'title' => 'Employee Export',
                'description' => 'Download employee master data as CSV.',
                'permission' => 'users_view',
                'route' => 'employees.export',
                'export_route' => null,
                'module' => 'employees',
            ],
            [
                'key' => 'leaves',
                'title' => 'Leave Balances',
                'description' => 'Team leave balances and pending requests.',
                'permission' => 'leaves_view',
                'route' => 'leaves.dashboard',
                'export_route' => null,
                'module' => 'leaves',
            ],
            [
                'key' => 'performance',
                'title' => 'Performance Summary',
                'description' => 'Review ratings and completion status by cycle.',
                'permission' => 'performance_view',
                'route' => 'reports.performance.export',
                'export_route' => 'reports.performance.export',
                'module' => 'performance',
            ],
            [
                'key' => 'audit_export',
                'title' => 'Audit Log Export',
                'description' => 'Sensitive actions across payroll, roles, and HR workflows.',
                'permission' => 'manage_settings',
                'route' => 'reports.audit.export',
                'export_route' => 'reports.audit.export',
                'module' => 'settings',
            ],
            [
                'key' => 'audit_viewer',
                'title' => 'Audit Log',
                'description' => 'Browse sensitive actions in the app (admins).',
                'permission' => 'manage_settings',
                'route' => 'settings.audit',
                'export_route' => 'reports.audit.export',
                'module' => 'settings',
            ],
            [
                'key' => 'expenses',
                'title' => 'Expense Claims',
                'description' => 'Operational expenses and reimbursement status.',
                'permission' => ['finance_view', 'finance_treasury_view', 'finance_operational', 'finance_team_view', 'finance_self_view', 'expenses_create_own'],
                'route' => 'expenses.index',
                'export_route' => 'reports.expenses.export',
                'module' => 'finance',
            ],
            [
                'key' => 'form_submissions',
                'title' => 'Form Submissions',
                'description' => 'Employee form responses with CSV export.',
                'permission' => 'documents_view',
                'route' => 'form-submissions.index',
                'export_route' => 'reports.form-submissions.export',
                'module' => 'documents',
            ],
        ];

        return array_values(array_filter($reports, fn (array $report) => $this->userCanAccessReport($user, $report)));
    }

    protected function userCanAccessReport(User $user, array $report): bool
    {
        $permission = $report['permission'];
        if (is_array($permission)) {
            foreach ($permission as $perm) {
                if ($user->hasPermission($perm)) {
                    return true;
                }
            }

            return false;
        }

        return $user->hasPermission($permission);
    }
}
