/**
 * UC22 — Case 248: Kiểm tra chức năng **Ngắt kế thừa**
 *
 * Kịch bản (theo mô tả người dùng):
 *   1. Tạo 1 Bộ hồ sơ, phân 5 quyền lần lượt Owner / Tạo mới / Cập nhật / Tải file / Xem cho
 *      `ecm04`, `ecm05`, **nhóm `AUTO_GROUP_ECM06`**, `ecm07`, `ecm08`.
 *   2. Tạo 1 thư mục ở gốc BHS → 5 quyền của thư mục phải **giống 5 quyền của BHS**.
 *   3. **Ngắt kế thừa** thư mục đó → **bớt** 1 người và **thêm** 1 người vào 1 khối quyền →
 *      **lưu thành công** là đạt.
 *
 * Chi tiết cách hiểu bước 3:
 * - "Ngắt kế thừa" ở modal **Cập nhật thư mục** = nút **"Đặt quyền độc lập"** (tab Phân quyền).
 *   Chọn chỗ này thay vì modal Phân quyền nâng cao vì ở đó chỉ **thêm** được quyền, **không bớt**
 *   được (`KHO-TAI-LIEU.MODAL-PHAN-QUYEN-NANG-CAO.md` mục 6).
 * - Thêm/bớt làm trên **cùng khối "Quyền tải file"** — khối này ở BHS chỉ có đúng 1 người (`ecm07`)
 *   nên xoá chip đầu tiên chắc chắn là xoá đúng người (chip **không mang tên** trong DOM).
 * - Ngoài toast "Thành công", case còn mở lại Phân quyền nâng cao để chắc thay đổi **đã lưu thật**:
 *   thư mục chuyển `Quyền riêng tư`, khối vừa sửa có `ecm08` và không còn `ecm07`, 4 khối còn lại
 *   giữ nguyên.
 *
 * 📌 Tên hiển thị lấy **động** (mở phiên của chính người đó rồi hover avatar) — `tests/README.md`
 * mục 2. Riêng **nhóm** không đăng nhập được nên `layTenDoiTuongPhanQuyen` trả về chính tên nhóm.
 *
 * ⚠️ Chưa khảo sát MCP: hành vi "Đặt quyền độc lập rồi xoá chip kế thừa và lưu". Tài liệu mới xác
 * nhận chip kế thừa **vẫn còn** sau khi đặt quyền độc lập (`MODAL-TAO-THU-MUC.md` mục 4b); việc app
 * cho xoá và lưu được hay không chính là **phép đo của case này**.
 */
import { Page } from "@playwright/test";
import { test, ACCOUNT, GROUP } from "../../src/fixture/base-test";
import {
  DOC_PERM,
  FOLDER_PICKER,
  PQ_COL,
  layTenDoiTuongPhanQuyen,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuPhan5Quyen } from "./1.4.1.setup";
import {
  taoThuMucOGocBoHoSo248,
  expectThuMucKeThuaQuyenBoHoSo,
  ngatKeThuaRoiSuaQuyenThuMuc248,
  expectQuyenRiengSauKhiLuu248,
  QuyenPhanCong,
  ThemBotQuyen248,
} from "./1.4.1.steps";

/**
 * 5 quyền của BHS → 5 đối tượng, theo đúng thứ tự người dùng nêu.
 * `fixture` = tên fixture để lấy tên hiển thị động; **nhóm** không có fixture (không đăng nhập được).
 */
const PHAN_QUYEN = [
  {
    account: "ecm04",
    fixture: "ecm04",
    nhanQuyen: "Quyền Owner",
    pickerTestId: DOC_PERM.OWNER,
    cot: PQ_COL.OWNER,
  },
  {
    account: "ecm05",
    fixture: "ecm05",
    nhanQuyen: "Quyền tạo mới",
    pickerTestId: DOC_PERM.ADD,
    cot: PQ_COL.ADD,
  },
  {
    account: GROUP.ECM06,
    fixture: "",
    nhanQuyen: "Quyền cập nhật",
    pickerTestId: DOC_PERM.EDIT,
    cot: PQ_COL.EDIT,
  },
  {
    account: "ecm07",
    fixture: "ecm07",
    nhanQuyen: "Quyền tải file",
    pickerTestId: DOC_PERM.DOWNLOAD,
    cot: PQ_COL.DOWNLOAD,
  },
  {
    account: "ecm08",
    fixture: "ecm08",
    nhanQuyen: "Quyền xem",
    pickerTestId: DOC_PERM.VIEW,
    cot: PQ_COL.VIEW,
  },
] as const;

/**
 * @param page  vai thao tác (người tạo BHS → là Owner của BHS)
 * @param phien phiên đăng nhập của các account được phân quyền — **chỉ** dùng để lấy tên hiển thị
 */
const runTest = async (
  page: Page,
  maCase: string,
  phien: Record<string, Page>,
) => {
  const duLieu = await dungDuLieuPhan5Quyen(page, {
    maCase,
    quyen: PHAN_QUYEN.map((q) => ({
      permTestId: q.pickerTestId,
      account: q.account,
    })),
  });

  const quyen: QuyenPhanCong[] = [];
  await test.step("Lấy tên hiển thị của 5 đối tượng được phân quyền", async () => {
    for (const q of PHAN_QUYEN) {
      quyen.push({
        cot: q.cot,
        nhanQuyen: q.nhanQuyen,
        account: q.account,
        tenHienThi: await layTenDoiTuongPhanQuyen({
          account: q.account,
          page: q.fixture ? phien[q.fixture] : undefined,
        }),
      });
    }
  });

  await taoThuMucOGocBoHoSo248(page, duLieu);
  await expectThuMucKeThuaQuyenBoHoSo(page, duLieu, quyen);

  // Bớt ecm07 (người duy nhất có Quyền tải file, do kế thừa) và thêm ecm08 vào chính khối đó
  const layQuyen = (cot: string) => quyen.find((q) => q.cot === cot)!;
  const thaoTac: ThemBotQuyen248 = {
    permTestId: FOLDER_PICKER.DOWNLOAD,
    cot: PQ_COL.DOWNLOAD,
    nhanQuyen: "Quyền tải file",
    bot: {
      account: layQuyen(PQ_COL.DOWNLOAD).account,
      tenHienThi: layQuyen(PQ_COL.DOWNLOAD).tenHienThi,
    },
    them: {
      account: layQuyen(PQ_COL.VIEW).account,
      tenHienThi: layQuyen(PQ_COL.VIEW).tenHienThi,
    },
  };

  await ngatKeThuaRoiSuaQuyenThuMuc248(page, duLieu, thaoTac);
  await expectQuyenRiengSauKhiLuu248(page, duLieu, quyen, thaoTac);
};

test(
  "UC22 248 - Kiểm tra chức năng ngắt kế thừa - Thủ thư" + ACCOUNT.LIBRARIAN,
  async ({ librarian, ecm04, ecm05, ecm07, ecm08 }) => {
    await runTest(librarian, "248-TT", { ecm04, ecm05, ecm07, ecm08 });
  },
);

test(
  "UC22 248 - Kiểm tra chức năng ngắt kế thừa - Admin" + ACCOUNT.ADMIN,
  async ({ admin, ecm04, ecm05, ecm07, ecm08 }) => {
    await runTest(admin, "248-AD", { ecm04, ecm05, ecm07, ecm08 });
  },
);
