/**
 * UC22 — Case 182: Kiểm tra giá trị mặc định trường Độ mật (modal "Thêm thư mục")
 *
 * Chỉ chạy với **1 tài khoản Admin** (theo yêu cầu người dùng — Độ mật mặc định không phụ thuộc
 * vai thao tác, chỉ phụ thuộc Độ mật của BHS / thư mục cha).
 *
 * Quy tắc Độ mật: **con phải ≥ cha** (Thường < Mật < Tuyệt mật) — xem `doMatChoPhepTrong`
 * trong `1.4.1.steps.ts`.
 *
 * ⚠️ Ràng buộc Độ mật cha–con (bước 4) và toast khi sửa BHS (bước 3) **chưa khảo sát bằng MCP** —
 * xem `1.4.1.md` mục "Điểm cần QA/DEV chốt".
 */
import { Page } from "@playwright/test";
import { test, expect, ACCOUNT } from "../../src/fixture/base-test";
import { TIMEOUT } from "../../src/constant/timeout";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createThuMuc,
  getCauTrucRow,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import {
  expectDoMatMacDinhRoiDong,
  doiDoMatBoHoSo,
  expectRangBuocDoMatThuMucCon,
} from "./1.4.1.steps";

const runTest = async (page: Page) => {
  const pw = new PW(page);
  const ts = Date.now();
  const tenHoSo = `AT-UC22-182-${ts}`;

  // ---- 1. Tạo BHS, Độ mật = "Thường" ----
  const recordUrl = await test.step(
    '1. Tiền điều kiện: tạo BHS, Độ mật = "Thường"',
    async () =>
      createBoHoSo(page, pw, tenHoSo, {
        fields: [{ testId: "sel-securityLevel", value: "Thường" }],
      }),
  );

  // ---- 2. Modal "Thêm thư mục" mặc định Độ mật = "Thường" ----
  await expectDoMatMacDinhRoiDong(page, recordUrl, "Thường");

  // ---- 3. Đổi Độ mật BHS → Độ mật mặc định của modal phải đổi theo ----
  await doiDoMatBoHoSo(page, recordUrl, "Mật");
  await expectDoMatMacDinhRoiDong(page, recordUrl, "Mật");

  await doiDoMatBoHoSo(page, recordUrl, "Tuyệt mật");
  await expectDoMatMacDinhRoiDong(page, recordUrl, "Tuyệt mật");

  // ---- 4. Ràng buộc Độ mật giữa thư mục cha và thư mục con ----

  // BHS đang là "Tuyệt mật" → theo quy tắc thì thư mục bên trong cũng chỉ được "Tuyệt mật",
  // không tạo nổi đủ 3 mức ở gốc. Trả BHS về "Thường" để cả 3 mức đều hợp lệ ở gốc.
  await doiDoMatBoHoSo(page, recordUrl, "Thường");

  const thuMucCha = [
    { ten: `${tenHoSo}-TM-Thuong`, doMat: "Thường" },
    { ten: `${tenHoSo}-TM-Mat`, doMat: "Mật" },
    { ten: `${tenHoSo}-TM-TuyetMat`, doMat: "Tuyệt mật" },
  ];

  await test.step(
    '4a. Tạo 3 thư mục ở gốc BHS với Độ mật "Thường" / "Mật" / "Tuyệt mật"',
    async () => {
      for (const [i, tm] of thuMucCha.entries()) {
        await createThuMuc(page, pw, recordUrl, tm.ten, {
          doMat: tm.doMat,
          // Thư mục đầu tiên phải mở lại BHS (đang ở tab "Thông tin" sau khi sửa Độ mật);
          // các thư mục sau tạo tiếp ngay trên tab "Cấu trúc hồ sơ" đang mở.
          moLaiBoHoSo: i === 0,
        });
      }
    },
  );

  // 4b. Với mỗi thư mục cha: Độ mật của thư mục con chỉ được ≥ Độ mật cha
  for (const tm of thuMucCha) {
    await expectRangBuocDoMatThuMucCon(page, recordUrl, tm.ten, tm.doMat);
  }

  // 4c. Chiều ngược lại phải làm được: trong thư mục "Mật" vẫn tạo được con "Tuyệt mật"
  //     (mức CAO hơn cha) — đây là điểm phân biệt quy tắc đúng với cách hiểu ngược ban đầu.
  const chaMat = thuMucCha[1];
  const conTuyetMat = `${chaMat.ten}-Con-TuyetMat-OK`;
  await test.step(
    `4c. Trong thư mục "${chaMat.ten}" (Mật) tạo được thư mục con "Tuyệt mật"`,
    async () => {
      await createThuMuc(page, pw, recordUrl, conTuyetMat, {
        parentName: chaMat.ten,
        doMat: "Tuyệt mật",
        moLaiBoHoSo: false,
      });

      await expect(getCauTrucRow(page, conTuyetMat), {
        message: `Lỗi: không tạo được thư mục con "Tuyệt mật" bên trong thư mục "Mật" — theo quy tắc thì mức cao hơn cha phải hợp lệ`,
      }).toBeVisible({ timeout: TIMEOUT.DATA_LOADING });
    },
  );
};

test(
  "UC22 182 - Kiểm tra giá trị mặc định trường Độ mật - Admin" + ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
