import { UserRole } from '../enums/index.js';
import { hasPermission, type Permission } from './index.js';

export const ROUTE_PERMISSIONS: Record<string, Permission[]> = {
  '/dashboard': ['dashboard.view'],
  '/setup': ['dashboard.view'],
  '/dashboard/sites': ['dashboard.view'],
  '/daily-operations': ['daily_operations.manage', 'daily_operations.complete'],
  '/audits': ['audit.create', 'audit.sign_off', 'audit.collaborate'],
  '/ncr-capa': ['ncr.create', 'ncr.close', 'capa.create', 'capa.close'],
  '/ncr': ['ncr.create', 'ncr.close'],
  '/capa': ['capa.create', 'capa.close'],
  '/actions': ['action.assign', 'action.close'],
  '/risks': ['risk.create', 'risk.close'],
  '/suppliers': ['supplier.manage'],
  '/documents': ['document.manage'],
  '/training': ['training.manage', 'training.complete'],
  '/pest-control': ['pest.manage', 'pest.complete'],
  '/management-review': ['management_review.manage'],
  '/complaints': ['complaint.manage'],
  '/incidents': ['incident.manage'],
  '/equipment': ['maintenance.manage'],
  '/traceability': ['traceability.manage'],
  '/monitoring': ['monitoring.manage', 'monitoring.complete'],
  '/reports': ['report.view'],
  '/analytics': ['report.view'],
  '/assistant': ['assistant.use'],
  '/notifications': ['dashboard.view'],
  '/portal/customer': ['portal.customer'],
  '/portal/supplier': ['portal.supplier'],
  '/settings': ['dashboard.view'],
  '/settings/organisation': ['dashboard.view'],
  '/settings/users': ['user.manage'],
  '/settings/billing': ['billing.manage'],
};

export function canAccessRoute(role: UserRole, path: string): boolean {
  const matchedPath = Object.keys(ROUTE_PERMISSIONS).find(
    (routePath) => path === routePath || path.startsWith(`${routePath}/`),
  );
  if (!matchedPath) return true;

  const permissions = ROUTE_PERMISSIONS[matchedPath];
  if (!permissions || permissions.length === 0) return true;
  return permissions.some((permission) => hasPermission(role, permission));
}

export function getAccessibleRoutes(role: UserRole): string[] {
  return Object.keys(ROUTE_PERMISSIONS).filter((path) => canAccessRoute(role, path));
}
