// [W6 S187 · YC-023/YC-024] HỌ QUY TRÌNH DUYỆT HỢP ĐỒNG — bản mirror FE của
// `SolutionErp.Domain/Contracts/ContractApprovalWorkflowFamily.cs` (NHÀ DUY NHẤT phía BE).
// Owner chốt @S188: (80) trục = 7 LOẠI HĐ · (81) PA-A mỗi loại MỘT mã quy trình riêng, 0 cột
// mới trong bảng quy trình — đúng khuôn `KHKK-N{n}` đã qua UAT.
//
// ══ VÌ SAO LÀ FILE RIÊNG, KHÔNG PHẢI HẰNG CỤC BỘ TRONG TRANG DESIGNER ═══════════════════
// Có ĐÚNG HAI chỗ đọc, và chúng ở hai tầng khác nhau:
//   1. `pages/system/ApprovalWorkflowsV2Page.tsx` — cắt lát `history` theo `Code` để panel của
//      loại này không hiện quy trình của 6 loại kia;
//   2. `components/Layout.tsx` `resolvePath` — đổi menu-key `AwV2_Hd*` thành đường dẫn
//      ("chỗ thứ 4" Pattern 16-bis; thiếu là leaf DROP IM LẶNG khỏi sidebar — gotcha #50).
// Chép 2 bản thì thêm loại HĐ thứ 8 phải sửa 2 nơi và LỆCH ĐƯỢC CÂM (menu trỏ tới `:typeCode`
// mà trang không nhận ⇒ rơi về lưới landing, trông y như "chưa cấu hình quy trình"). BE cố ý
// dựng để "thêm loại chỉ sửa 1 nơi"; FE giữ đúng tính chất đó.
//
// 🔴 fe-admin ONLY — KHÔNG-CẶP CÓ CHỦ ĐÍCH. fe-user không có màn Designer (Layout bên đó 0
//    nhánh `AwV2_*`, App.tsx 0 route `/system/approval-workflows-v2`). Đừng "vá" thành mirror
//    ×2 app ở lượt sau.

/**
 * `ApprovalWorkflowApplicableType.Contract` — CẢ 7 mã dưới đây đều là loại này.
 * (Cùng số 3 mà `TYPE_CODE_TO_INT.Contract` đang dùng cho deep-link `AwV2_Contract` cũ:
 * panel "cả loại Hợp đồng" và 7 panel per-loại đọc CÙNG một bucket của overview API.)
 */
export const AW_TYPE_INT_CONTRACT = 3

/** Tiền tố chung của cả họ — tách hằng để `contractWfKeyToken` cắt đúng độ dài (mirror `CodePrefix`). */
const CODE_PREFIX = 'HD-'

export type ContractWfFamilyMember = {
  /** Mã quy trình trong DB (`ApprovalWorkflow.Code`) — ASCII HOA, không dấu. */
  code: string
  /**
   * 🔴 Đây là enum **ContractType** (1..7, nhãn tra `ContractTypeLabel` ở `types/forms.ts`),
   * KHÔNG phải `ApplicableType`. Hai trục trùng số 3 một cách tình cờ
   * (`ContractType.HopDongNhaCungCap = 3` ⟂ `ApplicableType.Contract = 3`) — đừng dùng lẫn.
   */
  contractType: number
}

/**
 * 7 thành viên — thứ tự = `ContractType` 1..7 = thứ tự leaf trên sidebar (BE seed
 * `SeedMenuTreeAsync` Order 11..17). Giữ nguyên thứ tự này để hai bên không lệch mắt.
 */
export const CONTRACT_WF_FAMILY: readonly ContractWfFamilyMember[] = [
  { code: 'HD-TP', contractType: 1 },
  { code: 'HD-GK', contractType: 2 },
  { code: 'HD-NCC', contractType: 3 },
  { code: 'HD-DV', contractType: 4 },
  { code: 'HD-MB', contractType: 5 },
  { code: 'HD-NT-NCC', contractType: 6 },
  { code: 'HD-NT-DV', contractType: 7 },
]

/**
 * QUY TẮC ĐẶT KEY MENU (mirror `ContractApprovalWorkflowFamily.KeyToken`): bỏ tiền tố `HD-`,
 * bỏ mọi dấu `-`, GIỮ NGUYÊN hoa/thường phần còn lại ⇒ `HD-TP`→`TP`, `HD-NT-NCC`→`NTNCC`.
 * SUY TỪ MÃ chứ không khai thêm cột: mã đổi thì token đổi theo, không có đường lệch câm.
 */
export function contractWfKeyToken(code: string): string {
  const rest = code.startsWith(CODE_PREFIX) ? code.slice(CODE_PREFIX.length) : code
  return rest.replace(/-/g, '')
}

/**
 * Đoạn `:typeCode` trên URL Designer = phần sau `AwV2_` của menu-key BE
 * (`MenuKeys.ApprovalWorkflowContractLeaf` = `AwV2_Hd{token}`) ⇒ `HD-NT-NCC` → `HdNTNCC`.
 */
export const contractWfTypeCode = (code: string) => `Hd${contractWfKeyToken(code)}`

/**
 * Tra ngược từ `:typeCode` trên URL / phần sau `AwV2_` của menu-key.
 * 🔴 Tra bằng BẢNG, không cắt chuỗi ngược: `HdNTNCC` chẻ ra `NT-NCC` hay `N-TNCC` là hai mã
 * khác nhau và chỉ một cái tồn tại — đoán ngược là đẻ mã ma.
 * `null` = không thuộc họ ⇒ caller rơi về nhánh cũ (`TYPE_CODE_TO_INT`), KHÔNG tự nhận bừa.
 */
export function findContractWfByTypeCode(typeCode: string | null | undefined): ContractWfFamilyMember | null {
  if (!typeCode) return null
  return CONTRACT_WF_FAMILY.find(m => contractWfTypeCode(m.code) === typeCode) ?? null
}
