import { ProjectMemberRole, SystemRole } from '@prisma/client';

export const SYSTEM_ROLES = [
  'Super Admin',
  'Project Admin',
  'BA',
  'Developer',
  'Tester / QA',
] as const;

export type SystemRoleLabel = (typeof SYSTEM_ROLES)[number];

export const PROJECT_ROLES = [
  'Project Admin',
  'BA',
  'Developer',
  'Tester / QA',
  'Member',
] as const;

export type ProjectRoleLabel = (typeof PROJECT_ROLES)[number];

const toDb: Record<SystemRoleLabel, SystemRole> = {
  'Super Admin': SystemRole.SuperAdmin,
  'Project Admin': SystemRole.ProjectAdmin,
  BA: SystemRole.BA,
  Developer: SystemRole.Developer,
  'Tester / QA': SystemRole.TesterQA,
};

const fromDb: Record<SystemRole, SystemRoleLabel> = {
  SuperAdmin: 'Super Admin',
  ProjectAdmin: 'Project Admin',
  BA: 'BA',
  Developer: 'Developer',
  TesterQA: 'Tester / QA',
};

const projectToDb: Record<ProjectRoleLabel, ProjectMemberRole> = {
  'Project Admin': ProjectMemberRole.ProjectAdmin,
  BA: ProjectMemberRole.BA,
  Developer: ProjectMemberRole.Developer,
  'Tester / QA': ProjectMemberRole.TesterQA,
  Member: ProjectMemberRole.Member,
};

const projectFromDb: Record<ProjectMemberRole, ProjectRoleLabel> = {
  ProjectAdmin: 'Project Admin',
  BA: 'BA',
  Developer: 'Developer',
  TesterQA: 'Tester / QA',
  Member: 'Member',
};

export function systemRoleToDb(label: string): SystemRole {
  const r = toDb[label as SystemRoleLabel];
  if (!r) throw new Error(`Invalid system role: ${label}`);
  return r;
}

export function systemRoleFromDb(role: SystemRole): SystemRoleLabel {
  return fromDb[role];
}

export function projectRoleToDb(label: string): ProjectMemberRole {
  const r = projectToDb[label as ProjectRoleLabel];
  if (!r) throw new Error(`Invalid project role: ${label}`);
  return r;
}

export function projectRoleFromDb(role: ProjectMemberRole): ProjectRoleLabel {
  return projectFromDb[role];
}

export function isSuperAdmin(role: SystemRole): boolean {
  return role === SystemRole.SuperAdmin;
}

export function isProjectAdminRole(role: SystemRole): boolean {
  return role === SystemRole.ProjectAdmin || role === SystemRole.SuperAdmin;
}
