import {
  ANNOUNCEMENT_PERMISSIONS,
  AUDIT_LOG_PERMISSIONS,
  COURSE_AND_MATRIX_PERMISSIONS,
  EMPLOYEE_DIRECTORY_PERMISSIONS,
  NOTIFICATION_PERMISSIONS,
  ONLINE_LESSON_PERMISSIONS,
  ORGANIZATION_PERMISSIONS,
  PERMISSION_TEMPLATE_PERMISSIONS,
  REPORT_PERMISSIONS,
  TRAINING_RECORD_PERMISSIONS,
  USER_MANAGEMENT_PERMISSIONS,
  USER_PERMISSION_PERMISSIONS,
  type Permission,
} from "@/lib/auth/permissions";
import type {
  PermissionCatalogGroup,
  PermissionDefinition,
} from "../api/types";

type GroupConfig = {
  key: string;
  label: string;
  permissions: readonly Permission[];
};

const GROUPS: GroupConfig[] = [
  {
    key: "organization",
    label: "Organizations",
    permissions: ORGANIZATION_PERMISSIONS,
  },
  {
    key: "permission_templates",
    label: "Permission Templates",
    permissions: PERMISSION_TEMPLATE_PERMISSIONS,
  },
  {
    key: "user_permissions",
    label: "User Permissions",
    permissions: USER_PERMISSION_PERMISSIONS,
  },
  { key: "users", label: "Users", permissions: USER_MANAGEMENT_PERMISSIONS },
  {
    key: "employees",
    label: "Employees",
    permissions: EMPLOYEE_DIRECTORY_PERMISSIONS,
  },
  {
    key: "training_records",
    label: "Training Records",
    permissions: TRAINING_RECORD_PERMISSIONS,
  },
  {
    key: "announcements",
    label: "Announcements",
    permissions: ANNOUNCEMENT_PERMISSIONS,
  },
  {
    key: "online_lessons",
    label: "Online Lessons",
    permissions: ONLINE_LESSON_PERMISSIONS,
  },
  {
    key: "courses_matrix",
    label: "Courses & Training Matrix",
    permissions: COURSE_AND_MATRIX_PERMISSIONS,
  },
  { key: "reports", label: "Reports", permissions: REPORT_PERMISSIONS },
  {
    key: "audit_logs",
    label: "Audit Logs",
    permissions: AUDIT_LOG_PERMISSIONS,
  },
  {
    key: "notifications",
    label: "Notifications",
    permissions: NOTIFICATION_PERMISSIONS,
  },
];

const PERMISSION_METADATA: Record<
  Permission,
  Omit<PermissionDefinition, "module" | "value" | "label">
> = {
  "organization:manage": {
    action: "Manage",
    code: "organization:manage",
    name: "Manage",
    description:
      "จัดการข้อมูลองค์กร เช่น สร้าง แก้ไข ตั้งค่า เปิดหรือปิดการใช้งานองค์กร",
  },
  "organization:switch": {
    action: "Switch",
    code: "organization:switch",
    name: "Switch",
    description: "สลับองค์กรที่กำลังใช้งาน สำหรับผู้ใช้ที่มีสิทธิ์หลายองค์กร",
  },
  "permission_template:read": {
    action: "Read",
    code: "permission_template:read",
    name: "Read",
    description: "ดูรายการ Permission Template ทั้งหมด",
  },
  "permission_template:create": {
    action: "Create",
    code: "permission_template:create",
    name: "Create",
    description: "สร้าง Permission Template ใหม่",
  },
  "permission_template:update": {
    action: "Update",
    code: "permission_template:update",
    name: "Update",
    description: "แก้ไข Permission Template",
  },
  "permission_template:clone": {
    action: "Clone",
    code: "permission_template:clone",
    name: "Clone",
    description: "คัดลอก Permission Template เพื่อสร้างชุดสิทธิ์ใหม่",
  },
  "permission_template:delete": {
    action: "Delete",
    code: "permission_template:delete",
    name: "Delete",
    description: "ปิดการใช้งานหรือ Soft Delete Permission Template",
  },
  "permission_template:assign": {
    action: "Assign",
    code: "permission_template:assign",
    name: "Assign",
    description: "กำหนด Permission Template ให้ผู้ใช้งาน",
  },
  "user_permission:read": {
    action: "Read",
    code: "user_permission:read",
    name: "Read",
    description: "ดูสิทธิ์ของผู้ใช้งาน",
  },
  "user_permission:update": {
    action: "Update",
    code: "user_permission:update",
    name: "Update",
    description: "แก้ไขชุดสิทธิ์ของผู้ใช้งาน",
  },
  "user_permission:override": {
    action: "Override",
    code: "user_permission:override",
    name: "Override",
    description: "เพิ่มหรือลดสิทธิ์เฉพาะบุคคล โดยไม่กระทบ Template หลัก",
  },
  "user_permission:remove_override": {
    action: "Remove Override",
    code: "user_permission:remove_override",
    name: "Remove Override",
    description: "ยกเลิกสิทธิ์เฉพาะบุคคลที่เคยเพิ่มหรือลดไว้",
  },
  "users:read": {
    action: "Read",
    code: "users:read",
    name: "Read",
    description: "ดูรายการผู้ใช้งานในระบบ",
  },
  "users:create": {
    action: "Create",
    code: "users:create",
    name: "Create",
    description: "สร้างผู้ใช้งานใหม่ในระบบ",
  },
  "users:update": {
    action: "Update",
    code: "users:update",
    name: "Update",
    description: "แก้ไขข้อมูลผู้ใช้งาน",
  },
  "users:delete": {
    action: "Delete",
    code: "users:delete",
    name: "Delete",
    description: "ปิดใช้งานหรือลบผู้ใช้งานตามสิทธิ์ที่กำหนด",
  },
  "users:manage": {
    action: "Manage",
    code: "users:manage",
    name: "Manage",
    description: "จัดการผู้ใช้งานทั้งหมด รวมถึงบทบาทและสถานะการใช้งาน",
  },
  "employee_directory:read": {
    action: "Read",
    code: "employee_directory:read",
    name: "Read",
    description: "ดูข้อมูลรายชื่อพนักงาน",
  },
  "employee_directory:write": {
    action: "Write",
    code: "employee_directory:write",
    name: "Write",
    description: "เพิ่มหรือแก้ไขข้อมูลพนักงาน",
  },
  "employee_import:run": {
    action: "Run Import",
    code: "employee_import:run",
    name: "Run Import",
    description: "นำเข้าข้อมูลพนักงานจากไฟล์เข้าสู่ระบบ",
  },
  "employee_master_review:approve": {
    action: "Approve",
    code: "employee_master_review:approve",
    name: "Approve",
    description: "อนุมัติข้อมูลหลักของพนักงานที่รอตรวจสอบ",
  },
  "courses:read": {
    action: "Read",
    code: "courses:read",
    name: "Read",
    description: "ดูข้อมูลหลักสูตร",
  },
  "courses:write": {
    action: "Write",
    code: "courses:write",
    name: "Write",
    description: "เพิ่มหรือแก้ไขข้อมูลหลักสูตร",
  },
  "training_policy:read": {
    action: "Read",
    code: "training_policy:read",
    name: "Read",
    description: "ดูนโยบายการอบรมขององค์กร",
  },
  "training_policy:write": {
    action: "Write",
    code: "training_policy:write",
    name: "Write",
    description: "สร้างหรือแก้ไขนโยบายการอบรม",
  },
  "training_matrix:read": {
    action: "Read",
    code: "training_matrix:read",
    name: "Read",
    description: "ดู การอบรมตามตำแหน่ง ขององค์กร",
  },
  "training_matrix:write": {
    action: "Write",
    code: "training_matrix:write",
    name: "Write",
    description: "สร้างหรือแก้ไข การอบรมตามตำแหน่ง",
  },
  "training_record:self_read": {
    action: "View Self",
    code: "training_record:self_read",
    name: "View Self",
    description: "ดูประวัติการอบรมของตนเอง",
  },
  "training_record:self_write": {
    action: "Create or Update Self",
    code: "training_record:self_write",
    name: "Create or Update Self",
    description: "สร้างหรือแก้ไขประวัติการอบรมของตนเอง",
  },
  "training_record:read_all": {
    action: "View All",
    code: "training_record:read_all",
    name: "View All",
    description: "ดูประวัติการอบรมของทุกคนในองค์กร",
  },
  "training_record:write_all": {
    action: "Create or Update All",
    code: "training_record:write_all",
    name: "Create or Update All",
    description: "สร้างหรือแก้ไขประวัติการอบรมของทุกคนในองค์กร",
  },
  "training_record:submit": {
    action: "Submit",
    code: "training_record:submit",
    name: "Submit",
    description: "ส่งประวัติการอบรมเข้าสู่กระบวนการตรวจสอบ",
  },
  "training_record:review": {
    action: "Review",
    code: "training_record:review",
    name: "Review",
    description: "ตรวจสอบรายละเอียดประวัติการอบรมก่อนอนุมัติ",
  },
  "training_record:approve": {
    action: "Approve",
    code: "training_record:approve",
    name: "Approve",
    description: "อนุมัติประวัติการอบรม",
  },
  "training_record:reject": {
    action: "Reject",
    code: "training_record:reject",
    name: "Reject",
    description: "ไม่อนุมัติประวัติการอบรมและส่งกลับเพื่อแก้ไข",
  },
  "training_record:delete_draft": {
    action: "Delete Draft",
    code: "training_record:delete_draft",
    name: "Delete Draft",
    description: "ลบประวัติการอบรมที่ยังเป็นฉบับร่าง",
  },
  "training_record:manage_attachments": {
    action: "Manage Attachments",
    code: "training_record:manage_attachments",
    name: "Manage Attachments",
    description: "แนบ ลบ หรือจัดการไฟล์เอกสารของประวัติการอบรม",
  },
  "announcement:read_public": {
    action: "View Public",
    code: "announcement:read_public",
    name: "View Public",
    description: "ดูประกาศที่เผยแพร่แล้ว",
  },
  "announcement:read_all": {
    action: "View All",
    code: "announcement:read_all",
    name: "View All",
    description: "ดูประกาศทุกสถานะ รวมถึงฉบับร่างและที่รอตรวจสอบ",
  },
  "announcement:create": {
    action: "Create",
    code: "announcement:create",
    name: "Create",
    description: "สร้างประกาศใหม่",
  },
  "announcement:edit_draft": {
    action: "Edit Draft",
    code: "announcement:edit_draft",
    name: "Edit Draft",
    description: "แก้ไขประกาศที่ยังเป็นฉบับร่าง",
  },
  "announcement:delete_draft": {
    action: "Delete Draft",
    code: "announcement:delete_draft",
    name: "Delete Draft",
    description: "ยกเลิกเผยแพร่ที่ยังเป็นฉบับร่าง",
  },
  "announcement:submit": {
    action: "Submit",
    code: "announcement:submit",
    name: "Submit",
    description: "ส่งประกาศเข้าสู่กระบวนการอนุมัติ",
  },
  "announcement:approve": {
    action: "Approve",
    code: "announcement:approve",
    name: "Approve",
    description: "อนุมัติประกาศก่อนเผยแพร่",
  },
  "announcement:reject": {
    action: "Reject",
    code: "announcement:reject",
    name: "Reject",
    description: "ไม่อนุมัติประกาศและส่งกลับเพื่อแก้ไข",
  },
  "announcement:publish": {
    action: "Publish",
    code: "announcement:publish",
    name: "Publish",
    description: "เผยแพร่ประกาศให้ผู้ใช้งานสามารถมองเห็นได้",
  },
  "announcement:schedule": {
    action: "Schedule",
    code: "announcement:schedule",
    name: "Schedule",
    description: "กำหนดวันเวลาเผยแพร่ประกาศล่วงหน้า",
  },
  "announcement:unpublish": {
    action: "Unpublish",
    code: "announcement:unpublish",
    name: "Unpublish",
    description: "ยกเลิกการเผยแพร่ประกาศ",
  },
  "announcement:archive": {
    action: "Archive",
    code: "announcement:archive",
    name: "Archive",
    description: "เก็บประกาศเข้าคลังเพื่อไม่ให้แสดงในการใช้งานปกติ",
  },
  "announcement:restore": {
    action: "Restore",
    code: "announcement:restore",
    name: "Restore",
    description: "กู้คืนประกาศที่ถูก archive ให้กลับมาใช้งานได้",
  },
  "announcement:revision": {
    action: "Request Revision",
    code: "announcement:revision",
    name: "Request Revision",
    description: "ส่งประกาศกลับเพื่อให้ผู้จัดทำแก้ไขเพิ่มเติม",
  },
  "announcement:preview": {
    action: "Preview",
    code: "announcement:preview",
    name: "Preview",
    description: "ดูตัวอย่างประกาศก่อนเผยแพร่",
  },
  "announcement:view_history": {
    action: "View History",
    code: "announcement:view_history",
    name: "View History",
    description: "ดูประวัติการเปลี่ยนแปลงของประกาศ",
  },
  "online_lesson:read_public": {
    action: "View Public",
    code: "online_lesson:read_public",
    name: "View Public",
    description: "ดูบทเรียนออนไลน์ที่เผยแพร่แล้ว",
  },
  "online_lesson:read_all": {
    action: "View All",
    code: "online_lesson:read_all",
    name: "View All",
    description: "ดูบทเรียนออนไลน์ทุกสถานะ",
  },
  "online_lesson:create": {
    action: "Create",
    code: "online_lesson:create",
    name: "Create",
    description: "สร้างบทเรียนออนไลน์ใหม่",
  },
  "online_lesson:edit_draft": {
    action: "Edit Draft",
    code: "online_lesson:edit_draft",
    name: "Edit Draft",
    description: "แก้ไขบทเรียนออนไลน์ที่ยังเป็นฉบับร่าง",
  },
  "online_lesson:delete_draft": {
    action: "Delete Draft",
    code: "online_lesson:delete_draft",
    name: "Delete Draft",
    description: "ลบบทเรียนออนไลน์ที่ยังเป็นฉบับร่าง",
  },
  "online_lesson:submit": {
    action: "Submit",
    code: "online_lesson:submit",
    name: "Submit",
    description: "ส่งบทเรียนออนไลน์เข้าสู่กระบวนการอนุมัติ",
  },
  "online_lesson:approve": {
    action: "Approve",
    code: "online_lesson:approve",
    name: "Approve",
    description: "อนุมัติบทเรียนออนไลน์",
  },
  "online_lesson:reject": {
    action: "Reject",
    code: "online_lesson:reject",
    name: "Reject",
    description: "ไม่อนุมัติบทเรียนออนไลน์และส่งกลับเพื่อแก้ไข",
  },
  "online_lesson:publish": {
    action: "Publish",
    code: "online_lesson:publish",
    name: "Publish",
    description: "เผยแพร่บทเรียนออนไลน์ให้ผู้ใช้งานเห็น",
  },
  "online_lesson:schedule": {
    action: "Schedule",
    code: "online_lesson:schedule",
    name: "Schedule",
    description: "กำหนดเวลาเผยแพร่บทเรียนออนไลน์ล่วงหน้า",
  },
  "online_lesson:unpublish": {
    action: "Unpublish",
    code: "online_lesson:unpublish",
    name: "Unpublish",
    description: "ยกเลิกการเผยแพร่บทเรียนออนไลน์",
  },
  "online_lesson:archive": {
    action: "Archive",
    code: "online_lesson:archive",
    name: "Archive",
    description: "เก็บบทเรียนออนไลน์เข้าคลัง",
  },
  "online_lesson:restore": {
    action: "Restore",
    code: "online_lesson:restore",
    name: "Restore",
    description: "กู้คืนบทเรียนออนไลน์ที่ถูก archive",
  },
  "online_lesson:revision": {
    action: "Request Revision",
    code: "online_lesson:revision",
    name: "Request Revision",
    description: "ส่งบทเรียนออนไลน์กลับเพื่อแก้ไขเพิ่มเติม",
  },
  "online_lesson:preview": {
    action: "Preview",
    code: "online_lesson:preview",
    name: "Preview",
    description: "ดูตัวอย่างบทเรียนออนไลน์ก่อนเผยแพร่",
  },
  "online_lesson:view_history": {
    action: "View History",
    code: "online_lesson:view_history",
    name: "View History",
    description: "ดูประวัติการเปลี่ยนแปลงของบทเรียนออนไลน์",
  },
  "reports:self_read": {
    action: "View Self",
    code: "reports:self_read",
    name: "View Self",
    description: "ดูรายงานของตนเอง",
  },
  "reports:organization_read": {
    action: "View Organization",
    code: "reports:organization_read",
    name: "View Organization",
    description: "ดูรายงานภาพรวมของทั้งองค์กร",
  },
  "reports:export": {
    action: "Export",
    code: "reports:export",
    name: "Export",
    description: "ส่งออกรายงานเป็นไฟล์",
  },
  "reports:export_excel": {
    action: "Export Excel",
    code: "reports:export_excel",
    name: "Export Excel",
    description: "ส่งออกรายงานเป็นไฟล์ Excel",
  },
  "reports:export_pdf": {
    action: "Export PDF",
    code: "reports:export_pdf",
    name: "Export PDF",
    description: "ส่งออกรายงานเป็นไฟล์ PDF",
  },
  "audit_logs:read": {
    action: "View",
    code: "audit_logs:read",
    name: "View",
    description: "ดูประวัติการใช้งานระบบ",
  },
  "audit_logs:export": {
    action: "Export",
    code: "audit_logs:export",
    name: "Export",
    description: "ส่งออกประวัติการใช้งานระบบ",
  },
  "notifications:read": {
    action: "View",
    code: "notifications:read",
    name: "View",
    description: "ดูการแจ้งเตือนของระบบ",
  },
  "notifications:manage": {
    action: "Manage",
    code: "notifications:manage",
    name: "Manage",
    description: "จัดการการแจ้งเตือน เช่น สร้าง ส่ง หรืออัปเดตสถานะ",
  },
};

function getPermissionDefinition(
  module: string,
  permission: Permission,
): PermissionDefinition {
  const definition = PERMISSION_METADATA[permission];

  return {
    module,
    action: definition.action,
    code: definition.code,
    name: definition.name,
    description: definition.description,
    descriptionEn: definition.descriptionEn,
    value: definition.code,
    label: definition.code,
  };
}

export function getPermissionCatalogGroups(): PermissionCatalogGroup[] {
  return GROUPS.map((group) => ({
    key: group.key,
    label: group.label,
    permissions: group.permissions.map((permission) =>
      getPermissionDefinition(group.label, permission),
    ),
  }));
}

export function getPermissionCatalogCoverageCount() {
  return Object.keys(PERMISSION_METADATA).length;
}
