import { UserRole } from '../enums/index.js';

export type Permission =
  | 'audit.create'
  | 'audit.sign_off'
  | 'audit.collaborate'
  | 'ncr.create'
  | 'ncr.close'
  | 'capa.create'
  | 'capa.close'
  | 'action.assign'
  | 'action.close'
  | 'risk.create'
  | 'risk.close'
  | 'supplier.manage'
  | 'document.manage'
  | 'training.manage'
  | 'training.complete'
  | 'pest.manage'
  | 'pest.complete'
  | 'complaint.manage'
  | 'incident.manage'
  | 'maintenance.manage'
  | 'daily_operations.manage'
  | 'daily_operations.complete'
  | 'management_review.manage'
  | 'report.view'
  | 'assistant.use'
  | 'portal.customer'
  | 'portal.supplier'
  | 'user.manage'
  | 'dashboard.view'
  | 'org.manage'
  | 'billing.manage'
  | 'traceability.manage'
  | 'monitoring.manage'
  | 'monitoring.complete'
  | 'monitoring.verify';

const ROLE_PERMISSIONS: Record<UserRole, Permission[]> = {
  [UserRole.SYSTEM_ADMIN]: [
    'audit.create', 'audit.sign_off', 'ncr.create', 'ncr.close',
    'capa.create', 'capa.close', 'action.assign', 'action.close',
    'risk.create', 'risk.close', 'supplier.manage', 'document.manage', 'training.manage', 'training.complete',
    'pest.manage', 'pest.complete',
    'complaint.manage', 'incident.manage', 'maintenance.manage',
    'daily_operations.manage', 'daily_operations.complete', 'management_review.manage',
    'traceability.manage',
    'monitoring.manage', 'monitoring.complete', 'monitoring.verify',
    'report.view', 'assistant.use',
    'user.manage', 'dashboard.view', 'org.manage', 'billing.manage',
  ],
  [UserRole.COMPLIANCE_MANAGER]: [
    'audit.create', 'audit.sign_off', 'ncr.create', 'ncr.close',
    'capa.create', 'capa.close', 'action.assign', 'action.close',
    'risk.create', 'risk.close', 'supplier.manage', 'document.manage', 'training.manage', 'training.complete',
    'pest.manage', 'pest.complete',
    'complaint.manage', 'incident.manage', 'maintenance.manage',
    'daily_operations.manage', 'management_review.manage',
    'traceability.manage',
    'monitoring.manage', 'monitoring.complete', 'monitoring.verify',
    'report.view', 'assistant.use',
    'user.manage', 'dashboard.view',
  ],
  [UserRole.FOOD_SAFETY_MANAGER]: [
    'audit.create', 'audit.sign_off', 'ncr.create', 'ncr.close',
    'capa.create', 'action.assign', 'action.close',
    'risk.create', 'risk.close', 'supplier.manage', 'document.manage', 'training.manage', 'training.complete',
    'pest.manage', 'pest.complete',
    'complaint.manage', 'incident.manage', 'maintenance.manage',
    'daily_operations.manage', 'daily_operations.complete', 'management_review.manage',
    'traceability.manage',
    'monitoring.manage', 'monitoring.complete', 'monitoring.verify',
    'report.view', 'assistant.use',
    'dashboard.view',
  ],
  [UserRole.QUALITY_MANAGER]: [
    'audit.create', 'ncr.create', 'ncr.close', 'capa.create', 'capa.close',
    'action.assign', 'action.close', 'risk.create', 'document.manage',
    'complaint.manage', 'maintenance.manage',
    'daily_operations.manage', 'daily_operations.complete',
    'traceability.manage',
    'monitoring.manage', 'monitoring.complete', 'monitoring.verify',
    'report.view', 'assistant.use',
    'dashboard.view',
  ],
  [UserRole.DEPARTMENT_MANAGER]: [
    'ncr.create', 'capa.create', 'action.assign', 'action.close',
    'complaint.manage', 'daily_operations.complete',
    'monitoring.complete', 'monitoring.verify',
    'pest.complete', 'training.complete',
    'dashboard.view',
  ],
  [UserRole.AUDITOR]: [
    'audit.create', 'ncr.create', 'dashboard.view',
  ],
  [UserRole.EMPLOYEE]: [
    'action.close', 'daily_operations.complete', 'monitoring.complete',
    'pest.complete', 'training.complete',
    'dashboard.view',
  ],
  [UserRole.EXTERNAL_AUDITOR]: [
    'dashboard.view', 'audit.collaborate', 'report.view',
  ],
  [UserRole.CUSTOMER_PORTAL]: [
    'portal.customer', 'dashboard.view',
  ],
  [UserRole.SUPPLIER_PORTAL]: [
    'portal.supplier', 'dashboard.view',
  ],
};

export function hasPermission(role: UserRole, permission: Permission): boolean {
  return ROLE_PERMISSIONS[role]?.includes(permission) ?? false;
}

export function getPermissions(role: UserRole): Permission[] {
  return ROLE_PERMISSIONS[role] ?? [];
}
