import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import {
  DOC_PERM,
  layTenDoiTuongPhanQuyen,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieu177, DuLieu177 } from "./1.4.1.setup";
import { moThuMuc3DatQuyenRiengRoiDoiCapCha } from "./1.4.1.steps";

/**
 * ============================================================================
 * UC22 — 1.4.1 Tạo thư mục trong Cấu trúc hồ sơ
 * Case 177 (viết lại 2026-07-30 theo yêu cầu người dùng): Kiểm tra khi thay đổi trường
 * Thư mục/HS cấp cha
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE QA ──────────────────────────────────────────────────
 * Tiền điều kiện:
 *   - Đang ở màn **"Thêm thư mục"**
 *   - **Chọn thư mục/HS cấp cha mà người dùng có quyền Owner hoặc Tạo mới**
 * Thao tác:
 *   1. Truy cập màn hình Thêm thư mục
 *   2. Thực hiện thay đổi Thư mục/HS cấp cha
 * Mong muốn:
 *   Thay đổi được Thư mục cấp cha, đồng thời **các trường thông tin khác tự động được cập nhật
 *   theo đúng logic**: Độ mật · Trạng thái hiển thị · các thông tin đối tượng phân quyền.
 *
 * Tiền điều kiện chung của mục 1.4.1: xem `1.4.1.md`.
 *
 * ── KỊCH BẢN CỤ THỂ (theo yêu cầu người dùng 2026-07-30) ────────────────────
 * 1. Tạo bộ hồ sơ mới.
 * 2. Tạo **thư mục 1**: Trạng thái hiển thị = Private, Độ mật = Mật, quyền ĐỘC LẬP + thêm
 *    `ecm07` vào **TẤT CẢ 5 trường quyền**. Lấy tên hiển thị của `ecm07` (động).
 * 3. Tạo **thư mục 2**: Trạng thái hiển thị = Public, Độ mật = Thường, quyền ĐỘC LẬP + thêm
 *    `ecm08` vào **TẤT CẢ 5 trường quyền**. Lấy tên hiển thị của `ecm08` (động).
 * 4. Mở modal "Thêm thư mục" cho **thư mục 3** → **đặt quyền riêng** (bấm "Đặt quyền độc lập")
 *    TRƯỚC khi chọn cấp cha → chọn cấp cha = thư mục 1 → quan sát Độ mật/Trạng thái/cả 5 khối
 *    quyền **giống thư mục 1** (Mật / Private / `ecm07`) → đổi cấp cha = thư mục 2 → quan sát lại
 *    **giống thư mục 2** (Thường / Public / `ecm08`).
 *
 * ⚠️ **Điểm chưa khảo sát bằng MCP**: tổ hợp "đã Đặt quyền độc lập RỒI mới đổi cấp cha" (bước 4).
 * `KHO-TAI-LIEU.MODAL-TAO-THU-MUC.md` mục 3b mới xác nhận hành vi "đổi cấp cha tự cập nhật quyền"
 * khi thư mục còn ở chế độ **Kế thừa** (mặc định lúc mở modal). Script viết đúng theo 4 bước
 * người dùng yêu cầu; nếu chạy thật cho kết quả khác (vd quyền độc lập giữ nguyên, không bị ghi
 * đè theo cấp cha mới), đó là **kết quả test** cần báo QA/DEV, không phải lỗi script
 * (`CLAUDE.md` — "Đọc tiền điều kiện của testcase QA" mục 1).
 *
 * ── 3 TEST = 3 BỘ HỒ SƠ RIÊNG (giữ nguyên 3 vai của bản trước) ──────────────
 * | # | Vai thao tác    | Người dựng BHS + thư mục 1/2 | Trạng thái BHS |
 * |---|-----------------|-------------------------------|----------------|
 * | 1 | Thủ thư (ecm01) | chính vai đó                  | Khai báo       |
 * | 2 | ITAdmin (ecm09) | chính vai đó                  | Khai báo       |
 * | 3 | ecm06 (Owner ở BHS, kế thừa Owner xuống mọi thư mục) | Thủ thư | Hoạt động |
 *
 * ⚠️ Tên hiển thị của `ecm07`/`ecm08` lấy **động** (fixture → hover avatar) — tên user có thể bị
 *    đổi trong lúc test, xem `tests/README.md` mục 2.
 */

const runTest = async (
  performerPage: Page,
  duLieu: DuLieu177,
  ecm07Page: Page,
  ecm08Page: Page,
) => {
  const [tenEcm07, tenEcm08] = await Promise.all([
    layTenDoiTuongPhanQuyen({ account: "ecm07", page: ecm07Page }),
    layTenDoiTuongPhanQuyen({ account: "ecm08", page: ecm08Page }),
  ]);

  await moThuMuc3DatQuyenRiengRoiDoiCapCha(
    performerPage,
    duLieu,
    {
      ten: duLieu.tenThuMuc1,
      doMat: "Mật",
      trangThaiHienThi: "Private",
      tenNguoiCoQuyen: tenEcm07,
    },
    {
      ten: duLieu.tenThuMuc2,
      doMat: "Thường",
      trangThaiHienThi: "Public",
      tenNguoiCoQuyen: tenEcm08,
    },
  );
};

/* -------------------------------------------------------------------------- */
/* Vai tự tạo BHS (Thủ thư / ITAdmin) — tự dựng dữ liệu + tự thao tác          */
/* -------------------------------------------------------------------------- */

const runTestOwnerBoHoSo = async (
  page: Page,
  maCase: string,
  ecm07: Page,
  ecm08: Page,
) => {
  const duLieu = await dungDuLieu177(page, {
    maCase: `177-${maCase}`,
    cha1: { account: "ecm07", doMat: "Mật", trangThaiHienThi: "Private" },
    cha2: { account: "ecm08", doMat: "Thường", trangThaiHienThi: "Public" },
  });

  await runTest(page, duLieu, ecm07, ecm08);
};

/** TEST 1 — Thủ thư (ecm01). */
test(
  "UC22 177 - Kiểm tra khi thay đổi trường Thư mục/HS cấp cha - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian, ecm07, ecm08 }) => {
    await runTestOwnerBoHoSo(librarian, "TT", ecm07, ecm08);
  },
);

/** TEST 2 — ITAdmin (ecm09). Dữ liệu & thao tác y hệt TEST 1. */
test(
  "UC22 177 - Kiểm tra khi thay đổi trường Thư mục/HS cấp cha - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm07, ecm08 }) => {
    await runTestOwnerBoHoSo(admin, "AD", ecm07, ecm08);
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền (không phải người tạo BHS)                              */
/* -------------------------------------------------------------------------- */

/**
 * TEST 3 — `ecm06` được cấp **Owner ở BHS** nên kế thừa Owner xuống toàn bộ cấu trúc thư mục bên
 * trong (`CLAUDE.md` — "quyền cấp lớn bao trùm cấp nhỏ") — đúng tiền điều kiện QA "cấp cha mà
 * người dùng có quyền Owner". Thủ thư dựng BHS + thư mục 1/2, `ecm06` chỉ thao tác bước 4
 * (tạo thư mục 3, đổi cấp cha, quan sát).
 */
test(
  "UC22 177 - Kiểm tra khi thay đổi trường Thư mục/HS cấp cha - Người dùng có quyền Owner tại BHSecm06",
  async ({ librarian, ecm06, ecm07, ecm08 }) => {
    const duLieu = await dungDuLieu177(librarian, {
      maCase: "177-OWN",
      cha1: { account: "ecm07", doMat: "Mật", trangThaiHienThi: "Private" },
      cha2: { account: "ecm08", doMat: "Thường", trangThaiHienThi: "Public" },
      quyenBanDau: { permTestId: DOC_PERM.OWNER, account: "ecm06" },
      chuyenSangHoatDong: true,
    });

    await runTest(ecm06, duLieu, ecm07, ecm08);
  },
);
