using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace SolutionErp.Infrastructure.Persistence.Migrations
{
    // [K2 Mig 71 — S164 2026-07-31] KHKK mang HẠNG MỤC + NHÓM DUYỆT (SOL-CCM-SP-002).
    // 6 item, KHÔNG bảng mới (96 giữ nguyên), 0 RenameColumn:
    //   1. ContractSigningPlans +ApprovalGroup int   — nhóm duyệt 1..8, BACKFILL = 1
    //   2. ContractSigningPlans +EndedByLevelFinalize bit default 0 — cờ RUNTIME (xem ghi chú 🔴)
    //   3. ContractSigningPlanLines +CatalogEntryId uniqueidentifier NULL — loose-Guid, KHÔNG FK
    //   4. ContractSigningPlanLines +TenHangMuc nvarchar(500) NULL — denorm tên lúc gán
    //   5. UNIQUE (Plan, Supplier) → (Plan, Supplier, CatalogEntry) filtered [IsDeleted]=0 (#57)
    //   6. +2 index tra cứu: (ApprovalGroup, Phase) trên header · CatalogEntryId trên dòng
    //
    // 🔴 GHOST-WINDOW KHAI TRƯỚC (item 2): `EndedByLevelFinalize` do K2 ĐẺ, K3 TIÊU THỤ.
    //    Từ Mig 71 tới khi K3 land, cột này KHÔNG có site nào ghi ⇒ luôn = 0. Cố ý gộp vào
    //    đây để K3 = 0-mig (spec §②-9 + vá-7 item-6). Ai đọc cột này TRƯỚC K3 sẽ thấy "mọi
    //    phiếu đều không kết thúc sớm" — ĐÚNG với hiện trạng (service KHKK hiện chỉ có đúng
    //    MỘT nhánh set DaDuyet, là đường thường), không phải dữ liệu hỏng.
    //
    // 🔴 BẤT-BIẾN TIỀN: migration này có **0 câu lệnh** chạm `PeReferenceAmount` /
    //    `ProposedAmount` / `ApprovedAmount` ⇒ Σ trước == Σ sau là đúng theo CẤU TRÚC, không
    //    chỉ theo phép đo. (Đo local: cả Dev lẫn Design đều 0 dòng KHKK ⇒ Σ = tập RỖNG hai
    //    phía — khai thẳng vì "trích rỗng đọc thành sạch" là bẫy, phép đo prod mới có răng.)
    public partial class AddKhkkApprovalGroupCatalogAndFinalizeRuntime : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            // 🔴 UNIQUE CŨ CHẾT TỪ ĐÂY (item 5). Sau lệnh này, mắt xích chặn "2 dòng cùng
            // (Plan, Supplier) đều CatalogEntryId NULL" KHÔNG còn là index nữa — trong UNIQUE
            // index SQL Server NULL == NULL nên index MỚI vẫn chặn cặp NULL-trùng, nhưng nó
            // chặn bằng lỗi 2601 lúc SaveChanges (500 khó hiểu), không phải bằng nghiệp vụ.
            // Mắt xích THẬT do tầng ứng dụng giữ (vá-9) — hiện 1 lớp, K4b thêm lớp 2 (gate-K2 F-2):
            //   (a) SUBMIT-GUARD `ContractSigningPlanWorkflowService.SubmitAsync` — mọi dòng
            //       phải có hạng mục trước khi trình duyệt (ĐANG TỒN TẠI);
            //   (b) [K4b — THÌ TƯƠNG LAI] validator đường gán hạng mục của Lines-editor:
            //       `CatalogEntryId` BẮT BUỘC trên dòng mới qua API.
            // Dữ liệu cũ AN TOÀN không cần backfill dòng: unique cũ đã bảo đảm ≤ 1 dòng cho
            // mỗi cặp (Plan, Supplier) ⇒ tối đa 1 dòng NULL mỗi cặp, không thể đụng nhau.
            migrationBuilder.DropIndex(
                name: "IX_ContractSigningPlanLines_ContractSigningPlanId_SupplierId",
                table: "ContractSigningPlanLines");

            migrationBuilder.AddColumn<int>(
                name: "ApprovalGroup",
                table: "ContractSigningPlans",
                type: "int",
                nullable: false,
                defaultValue: 0);

            // BACKFILL = 1 (item 1). Mọi phiếu tồn tại trước K2 thuộc NHÓM 1 — acceptance
            // `COUNT(phiếu) == Σ COUNT 8 folder` (không phiếu nào rơi ngoài cây 8 nhóm).
            // Khuôn Mig 64 `Sql("UPDATE Suppliers SET IsPublic=1")`: `Sql()` trần, KHÔNG
            // provider-guard (khuôn Mig 61/65/67) — SQLite trong test dùng EnsureCreated nên
            // không chạy migration, không có nhánh nào cần rẽ. Vô điều kiện (KHÔNG
            // `WHERE ApprovalGroup = 0`) để phép đo có răng: rowcount phải == số phiếu cũ;
            // nếu viết WHERE thì backfill hụt sẽ trông y hệt backfill thành công.
            migrationBuilder.Sql("UPDATE [ContractSigningPlans] SET [ApprovalGroup] = 1;");

            migrationBuilder.AddColumn<bool>(
                name: "EndedByLevelFinalize",
                table: "ContractSigningPlans",
                type: "bit",
                nullable: false,
                defaultValue: false);

            migrationBuilder.AddColumn<Guid>(
                name: "CatalogEntryId",
                table: "ContractSigningPlanLines",
                type: "uniqueidentifier",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "TenHangMuc",
                table: "ContractSigningPlanLines",
                type: "nvarchar(500)",
                maxLength: 500,
                nullable: true);

            migrationBuilder.CreateIndex(
                name: "IX_ContractSigningPlans_ApprovalGroup_Phase",
                table: "ContractSigningPlans",
                columns: new[] { "ApprovalGroup", "Phase" });

            migrationBuilder.CreateIndex(
                name: "IX_ContractSigningPlanLines_CatalogEntryId",
                table: "ContractSigningPlanLines",
                column: "CatalogEntryId");

            migrationBuilder.CreateIndex(
                name: "IX_ContractSigningPlanLines_ContractSigningPlanId_SupplierId_CatalogEntryId",
                table: "ContractSigningPlanLines",
                columns: new[] { "ContractSigningPlanId", "SupplierId", "CatalogEntryId" },
                unique: true,
                filter: "[IsDeleted] = 0");
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropIndex(
                name: "IX_ContractSigningPlans_ApprovalGroup_Phase",
                table: "ContractSigningPlans");

            migrationBuilder.DropIndex(
                name: "IX_ContractSigningPlanLines_CatalogEntryId",
                table: "ContractSigningPlanLines");

            migrationBuilder.DropIndex(
                name: "IX_ContractSigningPlanLines_ContractSigningPlanId_SupplierId_CatalogEntryId",
                table: "ContractSigningPlanLines");

            migrationBuilder.DropColumn(
                name: "ApprovalGroup",
                table: "ContractSigningPlans");

            migrationBuilder.DropColumn(
                name: "EndedByLevelFinalize",
                table: "ContractSigningPlans");

            migrationBuilder.DropColumn(
                name: "CatalogEntryId",
                table: "ContractSigningPlanLines");

            migrationBuilder.DropColumn(
                name: "TenHangMuc",
                table: "ContractSigningPlanLines");

            // [gate-K2 F-8] Down chỉ AN TOÀN khi CHƯA có dữ liệu tách-dòng (pre-K4b): một khi 1 NCC
            // có nhiều dòng/phiếu (khác hạng mục), DropColumn ở trên đã xoá chiều phân biệt và
            // CreateIndex 2-cột dưới đây FAIL vì trùng (Plan, Supplier). Rollback lúc đó = quyết định
            // owner + dọn/gộp dữ liệu trước, không chạy Down mù.
            migrationBuilder.CreateIndex(
                name: "IX_ContractSigningPlanLines_ContractSigningPlanId_SupplierId",
                table: "ContractSigningPlanLines",
                columns: new[] { "ContractSigningPlanId", "SupplierId" },
                unique: true,
                filter: "[IsDeleted] = 0");
        }
    }
}
