namespace SolutionErp.Domain.Contracts;

// [S187 W3 — YC-023/YC-024] HỌ MÃ QUY TRÌNH DUYỆT HỢP ĐỒNG (ApprovalWorkflow V2, ApplicableType=3).
//
// Owner chốt @S188: (80) trục = **7 LOẠI HĐ** (không phải 8 nhóm duyệt SP-002) · (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 (khuôn KHKK `KHKK-N{n}` đã qua UAT).
//
// 🔴 ĐÂY LÀ NHÀ DUY NHẤT của 7 mã này ở production. Trước W3 chúng chỉ tồn tại trong test
//    (`UpdateAwDefinitionTests.cs:1573` `ContractFamilyCodes`) — test giữ bản riêng CÓ CHỦ ĐÍCH
//    (test không được lấy hằng của code làm kỳ vọng, không thì nó đo chính nó). Mọi chỗ KHÁC cần
//    "loại HĐ này đi quy trình mã nào" thì gọi `CodeFor`, ĐỪNG gõ lại chuỗi:
//      • `DbInitializer.SeedContractTypeWorkflowsAsync` — seed 7 quy trình;
//      • `MenuKeys.ContractWorkflowMenuKeys` — sinh 7 key Designer `AwV2_Hd*` (by-construction);
//      • W4 (nhịp sau) — rào auto-pin/re-pin so `Contract.Type` ↔ mã đã pin.
//
// ⚠️ ĐẶT Ở DOMAIN, không phải Application, vì `MenuKeys` (Domain/Identity) phải sinh key TỪ đây —
//    Domain không thấy được Application. Đây cũng là lý do KHÔNG nhét vào nhà KHKK
//    (`ContractSigningPlanWorkflowGuards`, tầng Application): 2 họ khác trục, khác tầng, khác vòng đời.
//
// 🔴 MÃ ASCII HOA, KHÔNG DẤU (FLAG-6): admin tạo version mới qua Designer phải lọt validator
//    `^[A-Za-z0-9._-]+$` (`ApprovalWorkflowV2AdminFeatures.cs:274-276`) — seeder không đi qua
//    validator nhưng vòng đời "clone tạo v02" thì CÓ ⇒ mã mang "Đ"/dấu là kẹt ở lần sửa đầu tiên.
//    Đường ghi còn chuẩn hoá `Trim().ToUpperInvariant()` (`:348`) ⇒ mã ở đây phải sẵn dạng HOA,
//    nếu không thì bản seed và bản admin-tạo là HAI chuỗi khác nhau trên SQLite (so BINARY).
public static class ContractApprovalWorkflowFamily
{
    /// Tiền tố chung của cả họ. Tách hằng để `KeyToken` cắt đúng độ dài, không gõ số 3.
    public const string CodePrefix = "HD-";

    /// 7 thành viên — thứ tự = thứ tự `ContractType` (1..7), cũng là thứ tự hiện trên sidebar.
    /// `ShortName` dùng cho CẢ tên quy trình ("Duyệt Hợp đồng — {ShortName}") LẪN nhãn menu
    /// Designer ⇒ 2 chỗ không thể lệch chữ.
    public static readonly (ContractType Type, string Code, string ShortName)[] Members =
    [
        (ContractType.HopDongThauPhu,         "HD-TP",     "Thầu phụ"),
        (ContractType.HopDongGiaoKhoan,       "HD-GK",     "Giao khoán"),
        (ContractType.HopDongNhaCungCap,      "HD-NCC",    "Nhà cung cấp"),
        (ContractType.HopDongDichVu,          "HD-DV",     "Dịch vụ"),
        (ContractType.HopDongMuaBan,          "HD-MB",     "Mua bán"),
        (ContractType.HopDongNguyenTacNCC,    "HD-NT-NCC", "Nguyên tắc NCC"),
        (ContractType.HopDongNguyenTacDichVu, "HD-NT-DV",  "Nguyên tắc Dịch vụ"),
    ];

    /// 7 mã, đúng thứ tự `Members`.
    public static readonly string[] Codes = Members.Select(m => m.Code).ToArray();

    /// Mã quy trình của một loại HĐ, `null` nếu loại nằm ngoài họ (enum nở thêm về sau).
    public static string? CodeFor(ContractType type)
    {
        foreach (var m in Members)
            if (m.Type == type) return m.Code;
        return null;
    }

    /// QUY TẮC ĐẶT KEY MENU (khai một lần, dùng mọi nơi): bỏ tiền tố `HD-`, bỏ mọi dấu `-`,
    /// GIỮ NGUYÊN hoa/thường của phần còn lại ⇒ `HD-TP`→`TP`, `HD-NT-NCC`→`NTNCC`.
    /// `MenuKeys` ghép thành `AwV2_Hd{token}` (⇒ `AwV2_HdTP`, `AwV2_HdNTNCC`).
    /// Suy TỪ mã chứ không khai thêm cột: mã đổi thì key đổi theo, không có đường lệch câm.
    public static string KeyToken(string code) =>
        code.StartsWith(CodePrefix, StringComparison.Ordinal)
            ? code[CodePrefix.Length..].Replace("-", string.Empty)
            : code.Replace("-", string.Empty);
}
