export const ContractPhase = {
  DangChon: 1,
  DangSoanThao: 2,
  DangGopY: 3,
  DangDamPhan: 4,
  DangInKy: 5,
  DangKiemTraCCM: 6,
  DangTrinhKy: 7,
  DangDongDau: 8,
  DaPhatHanh: 9,
  ChoDuyet: 10,
  TraLai: 98,
  TuChoi: 99,
} as const

export type ContractPhase = typeof ContractPhase[keyof typeof ContractPhase]

export const ContractPhaseLabel: Record<number, string> = {
  1: 'Đang chọn NCC',
  2: 'Nháp',
  3: 'Đang góp ý',
  4: 'Đang đàm phán',
  5: 'Đang in ký',
  6: 'CCM kiểm tra',
  7: 'Đang trình ký',
  8: 'Đang đóng dấu',
  9: 'Đã phát hành',
  10: 'Đã gửi duyệt',
  98: 'Trả lại',
  99: 'Từ chối',
}

export const ContractPhaseColor: Record<number, string> = {
  1: 'bg-slate-100 text-slate-700',
  2: 'bg-slate-100 text-slate-700',
  3: 'bg-amber-100 text-amber-700',
  4: 'bg-orange-100 text-orange-700',
  5: 'bg-purple-100 text-purple-700',
  6: 'bg-indigo-100 text-indigo-700',
  7: 'bg-fuchsia-100 text-fuchsia-700',
  8: 'bg-pink-100 text-pink-700',
  9: 'bg-emerald-100 text-emerald-700',
  10: 'bg-amber-100 text-amber-700',
  98: 'bg-yellow-100 text-yellow-800',
  99: 'bg-red-100 text-red-700',
}

export const ApprovalDecision = {
  Pending: 0,
  Approve: 1,
  Reject: 2,
  AutoApprove: 3,
} as const

export type ApprovalDecision = typeof ApprovalDecision[keyof typeof ApprovalDecision]

// 2-stage department approval (Migration 16) — Stage 1=Review NV, 2=Confirm TPB.
// BLOCK transition khi NV review chưa có TPB confirm cùng (HĐ, Phase, Dept).
// CanBypassReview=true → NV được Stage=Confirm + IsBypassed=true (skip Review).
export const ApprovalStage = {
  Review: 1,
  Confirm: 2,
} as const
export type ApprovalStage = typeof ApprovalStage[keyof typeof ApprovalStage]

export type ContractDepartmentApproval = {
  id: string
  phaseAtApproval: number
  departmentId: string
  departmentName: string | null
  stage: number              // 1=Review, 2=Confirm
  approverUserId: string
  approverName: string | null
  approverRoleSnapshot: string | null  // "TPB" | "NV" | "NV(bypass)"
  comment: string | null
  approvedAt: string
  isBypassed: boolean
}

export type ContractListItem = {
  id: string
  maHopDong: string | null
  tenHopDong: string | null
  type: number
  phase: number
  supplierId: string
  supplierName: string
  projectId: string
  projectName: string
  giaTri: number
  slaDeadline: string | null
  createdAt: string
  // [W7 KHKK S161] Cờ derive 1-MỐC cho trang "Hợp đồng cứng" (GĐ4): có ≥1 attachment
  // `AttachmentPurpose.SealedCopy = 3` ⇒ badge "Đã lưu bản cứng". BE append CUỐI
  // `ContractListItemDto` (projection, không trả cả list attachments).
  hasSealedCopy: boolean
}

export type ContractApproval = {
  id: string
  fromPhase: number
  toPhase: number
  approverUserId: string | null
  approverName: string | null
  decision: number
  comment: string | null
  approvedAt: string
}

export type ContractComment = {
  id: string
  userId: string
  userName: string
  phase: number
  content: string
  createdAt: string
}

export type ContractAttachment = {
  id: string
  fileName: string
  storagePath: string
  fileSize: number
  contentType: string
  purpose: number
  note: string | null
  createdAt: string
}

export type WorkflowSummary = {
  policyName: string
  policyDescription: string
  activePhases: number[]
  nextPhases: number[]
}

export type ContractDetail = {
  id: string
  maHopDong: string | null
  tenHopDong: string | null
  noiDung: string | null
  type: number
  phase: number
  supplierId: string
  supplierName: string
  projectId: string
  projectName: string
  departmentId: string | null
  departmentName: string | null
  drafterUserId: string | null
  drafterName: string | null
  templateId: string | null
  giaTri: number
  bypassProcurementAndCCM: boolean
  slaDeadline: string | null
  draftData: string | null
  createdAt: string
  updatedAt: string | null
  // [S61 Mig 50] budgetId/budget link DROP (module Budget cũ xóa) — HĐ GIỮ
  // ngân sách nhập tay.
  budgetManualName: string | null
  budgetManualAmount: number | null
  approvals: ContractApproval[]
  comments: ContractComment[]
  attachments: ContractAttachment[]
  workflow: WorkflowSummary
  // [Plan B S29 2026-05-22 Chunk E3] V2 workflow state — mirror PE pattern.
  // Khi pin V2 (approvalWorkflowId set) → render Section 5 dynamic.
  // V1 contract: 3 fields = null.
  approvalWorkflowId: string | null
  currentApprovalLevelOrder: number | null
  levelOpinions: ContractLevelOpinion[] | null

  // ========= [W2 S187 · YC-023 GĐ3] Nguồn gốc KHKK + cây quy trình V2 (3 field) ==========
  // 🔴 Khai `?` KÈM `| null` CÓ CHỦ ĐÍCH — 2 nghĩa KHÁC NHAU, đừng gộp:
  //   • `undefined` (vắng key) = payload đến từ API/bundle CHƯA có W2, hoặc cache TanStack cũ;
  //   • `null` = BE đã trả lời "HĐ này KHÔNG có nguồn KHKK / chưa pin quy trình".
  // BE append 3 field này ở CUỐI `ContractDetailDto` với default null (hôm nay field cuối là
  // `LevelOpinions` — `ContractDtos.cs:64`) ⇒ wire cũ không vỡ. Nơi đọc PHẢI null-check,
  // TUYỆT ĐỐI không suy "vắng field ⇒ HĐ tạo tay".
  /** HĐ kế thừa từ phiếu KHKK đã duyệt (bridge K7). HĐ tạo tay ⇒ null, FE không render card. */
  source?: ContractSource | null
  /** INDEX 0-based vào mảng `workflowSteps` (KHÔNG phải `order`) — mirror khuôn KHKK. */
  currentWorkflowStepIndex?: number | null
  /** Cây quy trình THÔ (xem `ContractWorkflowStep`). */
  workflowSteps?: ContractWorkflowStep[] | null

  // ===== [WQ3b S190 · YC-030 Q3] 3 field meta/kết-thúc-sớm (BE `ContractDtos.cs:103-105`) =====
  // Khai `?` theo ĐÚNG quy ước 2-nghĩa của khối trên: `undefined` = bundle/cache CHƯA có WQ3-BE.
  /**
   * Mã QUY TRÌNH V2 đã pin (`HD-TP`, `HD-NCC`…) — 🔴 KHÔNG phải `maHopDong`, hai thứ cùng
   * gọi là "mã". `null` khi HĐ chưa pin V2 (V1 legacy) ⇒ panel không vẽ dòng meta.
   */
  workflowCode?: string | null
  /** Số phiên bản quy trình đã pin — hiển thị `v{NN}` (pad 2). */
  workflowVersion?: number | null
  /**
   * CỜ RUNTIME (BE Mig 73, write-site duy nhất `ContractWorkflowService.cs:529`): HĐ này ĐÃ
   * kết thúc sớm tại một Cấp được uỷ quyền. 🔴 KHÔNG suy từ `allowApproverFinalize` của cây —
   * cờ cây là CẤU HÌNH (được phép), cờ này là VIỆC ĐÃ XẢY RA (bài #78 / PE Mig 60).
   * BE non-nullable (V1 legacy = `false`); `?` ở đây chỉ để chịu payload cũ.
   */
  endedByLevelFinalize?: boolean
}

/**
 * [WQ3b S190 · YC-030 Q3] Body `POST /contracts/{id}/transitions` — mirror BE
 * `TransitionContractBody` (`ContractsController.cs:269-274`).
 * 🔴 2 field cuối OMIT-ĐƯỢC và omit KHÔNG đồng nghĩa `false`:
 *   • `applyLevelFinalize` bỏ trống ⇒ controller `?? true` (`:71`) ⇒ Cấp có
 *     `allowApproverFinalize` sẽ KẾT THÚC quy trình. Muốn opt-out phải gửi `false` TƯỜNG MINH.
 *   • `skipToFinal` bỏ trống ⇒ `false` (mặc định record BE). FE hiện KHÔNG có đường bấm cho cờ
 *     này (nó là F2/Mig 31, cần `allowApproverSkipToFinal` mà DTO cây chưa trả) — khai ở đây để
 *     nơi gọi thấy đủ hình dạng API, KHÔNG phải để dùng ngay.
 */
export type TransitionContractBody = {
  targetPhase: number
  decision: number
  comment: string | null
  applyLevelFinalize?: boolean
  skipToFinal?: boolean
}

// [W2 S187 · YC-023] Khối "Nguồn gốc KHKK" — BE reverse-join `ContractSigningPlanLines
// WHERE ContractId = id` → phiếu KHKK + hạng mục + Σ tiền (spec `§2 W2(a)`). Link nằm ở
// `ContractSigningPlanLine.ContractId`, KHÔNG có con-trỏ ngược trên `Contract` ⇒ HĐ 0 dòng
// nối trả null.
// ✅ FLAG-A ĐÓNG @S188 (reviewer F-1): BE đặt `Source` (`ContractDtos.cs:87`) đúng AC spec ⇒ FE
// rename khớp JSON BE từng tên: `contractSource`→`source` · `tenHangMuc`→`tenHangMucs` ·
// `totalApprovedAmount`→`approvedAmountTotal` (JSON bind theo TÊN; System.Text.Json camelCase).
export type ContractSource = {
  /** Mã phiếu KHKK, vd `KHKK/2026/001`. null khi phiếu cha đã xoá mềm (F-2 — BE trả null qua global filter). */
  maKeHoach: string | null
  planId: string
  /** Nhóm duyệt N1–N8 của phiếu (Mig 71). null = phiếu không mang nhóm. */
  approvalGroup?: number | null
  /** Tên các hạng mục của phiếu đã nối sang HĐ này (có thể rỗng). */
  tenHangMucs: string[]
  /** Σ `ApprovedAmount` các dòng nối — số đã đóng băng tại choke-point finalize của phiếu. */
  approvedAmountTotal?: number | null
  /** Phiếu Duyệt NCC gốc — chuỗi PE → KHKK → HĐ. */
  purchaseEvaluationId?: string | null
}

// [W2 S187] Cây quy trình THÔ do BE trả — mirror khuôn KHKK (`types/khkk.ts:275-296`, BE
// `ContractSigningPlanFeatures.cs:131-152`).
// 🔴 KHÁC PE: BE **KHÔNG** precompute `status` Done/Current/Pending. FE tự suy từ CẶP con-trỏ
// `currentWorkflowStepIndex` (INDEX 0-based vào mảng steps) + `currentApprovalLevelOrder`
// (GIÁ TRỊ `level.order`, KHÔNG phải index).
export type ContractWorkflowLevel = {
  id: string
  order: number
  name: string | null
  approverUserId: string
  approverFullName: string | null
  /** Cờ per-Cấp "được KẾT THÚC quy trình tại cấp này" — spec `§2 W2(b)` gọi là "cờ per-level". */
  allowApproverFinalize: boolean
}

export type ContractWorkflowStep = {
  id: string
  order: number
  name: string
  levels: ContractWorkflowLevel[]
  // 2 field dưới có trong khuôn KHKK nhưng spec W2 KHÔNG nêu tên ⇒ khai `?` để nơi đọc buộc
  // null-check, thay vì hứa một field payload có thể không mang (bài học `khkk.ts:403-407`).
  departmentId?: string | null
  departmentName?: string | null
}

// [Plan B S29 2026-05-22 Chunk E3] Mirror BE ContractLevelOpinionDto 12 fields.
// Service ApproveV2Async UPSERT (Plan B Chunk B2). Comment empty → "(duyệt —
// không ý kiến)". signedByUserId !== approverUserId → banner "Admin duyệt thay".
export type ContractLevelOpinion = {
  id: string
  approvalWorkflowLevelId: string
  stepOrder: number
  stepName: string
  levelOrder: number
  levelName: string | null
  approverUserId: string
  approverFullName: string | null
  comment: string
  signedAt: string
  signedByUserId: string
  signedByFullName: string | null
}
