export type RoleLanguage = "en" | "kh";

export function normalizeRoleLanguage(
  language?: string | null,
): RoleLanguage {
  return language === "kh" || language === "km" ? "kh" : "en";
}

export const roleI18n = {
  en: {
    title: "Role and Permission",
    description: "Manage role and permission of user",
    createRole: "Create Role",
    editRole: "Edit Role",
    createRoleTitle: "Create Role",
    formDescriptionCreate:
      "Define permissions and assign access for a new role.",
    formDescriptionEdit:
      "Define permissions and assign access for this role.",
    roleName: "Role Name",
    roleNamePlaceholder: "Enter role name",
    roleNameRequired: "Role name is required.",
    guardName: "Guard Name",
    status: "Status",
    active: "Active",
    inactive: "Inactive",
    permissions: "Permissions",
    resources: "Resources",
    resource: "Resource",
    updated: "Updated",
    no: "No.",
    emptyRoles: "No roles found.",
    view: "View",
    edit: "Edit",
    delete: "Delete",
    close: "Close",
    cancel: "Cancel",
    saving: "Saving...",
    saveChanges: "Save Changes",
    createRoleSubmit: "Create role",
    actionsAria: "Role actions",
    roleDetail: "Role Detail",
    assignedPermissions: "Assigned Permissions",
    noPermissionsAssigned: "No permissions assigned to this role.",
    allResources: "All Resources",
    fullAccess: "Full access",
    resourcesHint: "Toggle every permission for this role or adjust per row.",
    permissionsActive: (active: number, total: number) =>
      `${active} of ${total} permissions active`,
    clearAll: "Clear all",
    selectAll: "Select all",
    noPermissionsToAssign: "No permissions available to assign.",
    loadDetailError: "Could not load role detail.",
    loadFormError: "Could not load the form.",
    saveError: "Could not save the role.",
    deleteConfirm: (name: string) => `Delete role "${name}"?`,
    deletedSuccess: "Role deleted successfully.",
    deleteError: "Could not delete the role.",
    loadRolesError: "Unable to load roles.",
    formCheckError: "Please check the form and try again.",
    permissionDeniedError: "You do not have permission to do this.",
    roleNotFoundError: "Role not found.",
    roleNameExistsError: "A role with this name already exists.",
    requestFailed: (status: string) => `Request failed (${status}).`,
    actionView: "View",
    actionCreate: "Create",
    actionUpdate: "Update",
    actionDelete: "Delete",
    actionExport: "Export",
    resourceUsers: "Users",
    resourceRoles: "Roles",
    resourcePermissions: "Permissions",
    resourceStakeholders: "Stakeholders",
    resourceWorkingGroupIssues: "Working Group Issues",
    resourceIssueMatrix: "Issue Matrix",
    resourceMeetings: "Meetings",
    resourceMeetingRequests: "Meeting Requests",
    resourceMeetingSummaries: "Meeting Summaries",
    resourceCdcIssueMatrix: "CDC Issue Matrix",
    resourceCefpIssueMatrix: "CEFP Issue Matrix",
    resourceProgressReports: "Progress Reports",
    resourceMinistryProgressReports: "Ministry Progress Reports",
  },
  kh: {
    title: "តួនាទី និងសិទ្ធិ",
    description: "គ្រប់គ្រងតួនាទី និងសិទ្ធិរបស់អ្នកប្រើប្រាស់",
    createRole: "បង្កើតតួនាទី",
    editRole: "កែសម្រួលតួនាទី",
    createRoleTitle: "បង្កើតតួនាទី",
    formDescriptionCreate: "កំណត់សិទ្ធិ និងចាត់តាំងការចូលប្រើសម្រាប់តួនាទីថ្មី។",
    formDescriptionEdit: "កំណត់សិទ្ធិ និងចាត់តាំងការចូលប្រើសម្រាប់តួនាទីនេះ។",
    roleName: "ឈ្មោះតួនាទី",
    roleNamePlaceholder: "បញ្ចូលឈ្មោះតួនាទី",
    roleNameRequired: "ត្រូវការឈ្មោះតួនាទី។",
    guardName: "ឈ្មោះ Guard",
    status: "ស្ថានភាព",
    active: "កំពុងដំណើរការ",
    inactive: "បានបិទ",
    permissions: "សិទ្ធិ",
    resources: "ធនធាន",
    resource: "ធនធាន",
    updated: "បានធ្វើបច្ចុប្បន្នភាព",
    no: "ល.រ",
    emptyRoles: "រកមិនឃើញតួនាទីទេ។",
    view: "មើល",
    edit: "កែសម្រួល",
    delete: "លុប",
    close: "បិទ",
    cancel: "បោះបង់",
    saving: "កំពុងរក្សាទុក...",
    saveChanges: "រក្សាទុកការផ្លាស់ប្តូរ",
    createRoleSubmit: "បង្កើតតួនាទី",
    actionsAria: "សកម្មភាពតួនាទី",
    roleDetail: "ព័ត៌មានលម្អិតតួនាទី",
    assignedPermissions: "សិទ្ធិដែលបានចាត់តាំង",
    noPermissionsAssigned: "មិនមានសិទ្ធិចាត់តាំងសម្រាប់តួនាទីនេះទេ។",
    allResources: "ធនធានទាំងអស់",
    fullAccess: "ចូលប្រើពេញលេញ",
    resourcesHint:
      "បើក/បិទសិទ្ធិទាំងអស់សម្រាប់តួនាទីនេះ ឬកែតាមជួរនីមួយៗ។",
    permissionsActive: (active: number, total: number) =>
      `សិទ្ធិសកម្ម ${active} ក្នុងចំណោម ${total}`,
    clearAll: "សម្អាតទាំងអស់",
    selectAll: "ជ្រើសរើសទាំងអស់",
    noPermissionsToAssign: "មិនមានសិទ្ធិសម្រាប់ចាត់តាំងទេ។",
    loadDetailError: "មិនអាចផ្ទុកព័ត៌មានលម្អិតតួនាទីបានទេ។",
    loadFormError: "មិនអាចផ្ទុកទម្រង់បានទេ។",
    saveError: "មិនអាចរក្សាទុកតួនាទីបានទេ។",
    deleteConfirm: (name: string) => `តើអ្នកចង់លុបតួនាទី "${name}" ឬ?`,
    deletedSuccess: "បានលុបតួនាទីដោយជោគជ័យ។",
    deleteError: "មិនអាចលុបតួនាទីបានទេ។",
    loadRolesError: "មិនអាចផ្ទុកតួនាទីបានទេ។",
    formCheckError: "សូមពិនិត្យទម្រង់ រួចព្យាយាមម្តងទៀត។",
    permissionDeniedError: "អ្នកមិនមានសិទ្ធិធ្វើសកម្មភាពនេះទេ។",
    roleNotFoundError: "រកមិនឃើញតួនាទីទេ។",
    roleNameExistsError: "តួនាទីដែលមានឈ្មោះនេះមានរួចហើយ។",
    requestFailed: (status: string) => `សំណើបានបរាជ័យ (${status})។`,
    actionView: "មើល",
    actionCreate: "បង្កើត",
    actionUpdate: "កែប្រែ",
    actionDelete: "លុប",
    actionExport: "នាំចេញ",
    resourceUsers: "អ្នកប្រើប្រាស់",
    resourceRoles: "តួនាទី",
    resourcePermissions: "សិទ្ធិ",
    resourceStakeholders: "ស្ថាប័ន",
    resourceWorkingGroupIssues: "បញ្ហាក្រុមការងារ",
    resourceIssueMatrix: "ម៉ាទ្រីសបញ្ហា",
    resourceMeetings: "ការប្រជុំ",
    resourceMeetingRequests: "សំណើប្រជុំ",
    resourceMeetingSummaries: "សង្ខេបការប្រជុំ",
    resourceCdcIssueMatrix: "ម៉ាទ្រីសបញ្ហា CDC",
    resourceCefpIssueMatrix: "ម៉ាទ្រីសបញ្ហា CEFP",
    resourceProgressReports: "របាយការណ៍វឌ្ឍនភាព",
    resourceMinistryProgressReports: "របាយការណ៍វឌ្ឍនភាពក្រសួង",
  },
} as const;

export function getRoleText(language?: string | null) {
  return roleI18n[normalizeRoleLanguage(language)];
}

export type RoleText = (typeof roleI18n)[RoleLanguage];

function normalizeResourceKey(value: string) {
  return value
    .replace(/([a-z])([A-Z])/g, "$1 $2")
    .replace(/[_-]+/g, " ")
    .trim()
    .toLowerCase();
}

const RESOURCE_LABEL_KEYS: Record<string, keyof RoleText> = {
  user: "resourceUsers",
  users: "resourceUsers",
  role: "resourceRoles",
  roles: "resourceRoles",
  permission: "resourcePermissions",
  permissions: "resourcePermissions",
  stakeholder: "resourceStakeholders",
  stakeholders: "resourceStakeholders",
  workinggroupissue: "resourceWorkingGroupIssues",
  "working group issue": "resourceWorkingGroupIssues",
  "working group issues": "resourceWorkingGroupIssues",
  issuematrix: "resourceIssueMatrix",
  "issue matrix": "resourceIssueMatrix",
  meeting: "resourceMeetings",
  meetings: "resourceMeetings",
  meetingrequest: "resourceMeetingRequests",
  "meeting request": "resourceMeetingRequests",
  "meeting requests": "resourceMeetingRequests",
  meetingsummary: "resourceMeetingSummaries",
  "meeting summary": "resourceMeetingSummaries",
  "meeting summaries": "resourceMeetingSummaries",
  cdcissuematrix: "resourceCdcIssueMatrix",
  "cdc issue matrix": "resourceCdcIssueMatrix",
  cefpissuematrix: "resourceCefpIssueMatrix",
  "cefp issue matrix": "resourceCefpIssueMatrix",
  progressreport: "resourceProgressReports",
  "progress report": "resourceProgressReports",
  "progress reports": "resourceProgressReports",
  progressreportministry: "resourceMinistryProgressReports",
  "ministry progress report": "resourceMinistryProgressReports",
  "ministry progress reports": "resourceMinistryProgressReports",
};

export function translateRoleResourceLabel(value: string, t: RoleText) {
  const spaced = normalizeResourceKey(value);
  const compact = spaced.replace(/\s+/g, "");
  const key = RESOURCE_LABEL_KEYS[spaced] ?? RESOURCE_LABEL_KEYS[compact];

  if (!key) return value;

  const label = t[key];

  return typeof label === "string" ? label : value;
}

export function translateRoleErrorMessage(message: string, t: RoleText) {
  if (message === roleI18n.en.formCheckError) return t.formCheckError;
  if (message === roleI18n.en.permissionDeniedError) {
    return t.permissionDeniedError;
  }
  if (message === roleI18n.en.roleNotFoundError) return t.roleNotFoundError;
  if (message === roleI18n.en.roleNameExistsError) return t.roleNameExistsError;

  const failed = message.match(/^Request failed \((\d+)\)$/);
  if (failed?.[1]) return t.requestFailed(failed[1]);

  return message;
}
