import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import {
  DOC_PERM,
  layTenHienThiNguoiDangDangNhap,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieuBoHoSo, DuLieu } from "./1.4.1.setup";
import {
  taoThuMucDayDuThongTin,
  expectThuMucHienThiDungViTri,
  expectThuocTinhThuMucDaLuu,
  expectNguoiTaoLaOwnerThuMuc,
} from "./1.4.1.steps";

/**
 * ============================================================================
 * UC22 — 1.4.1 Tạo thư mục trong Cấu trúc hồ sơ
 * Case 163 (QA): Kiểm tra thêm mới thư mục thành công khi nhập đầy đủ các thông tin bắt buộc
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE ─────────────────────────────────────────────────────
 * Tiền điều kiện: (QA để trống → dùng tiền điều kiện chung của mục 1.4.1, xem `1.4.1.md`)
 * Thao tác:
 *   1. Trên màn hình chi tiết bộ hồ sơ, tại tab Cấu trúc hồ sơ, chọn Thêm Thư mục
 *   2. Nhập đầy đủ các trường thông tin bắt buộc hợp lệ
 *   3. Nhấn nút Xác nhận
 * Mong muốn:
 *   Hệ thống kiểm tra dữ liệu được nhập và thực hiện:
 *   - Thông báo **"Thành công"**
 *   - **Lưu thuộc tính Thư mục** với dữ liệu đã nhập
 *   - **Hiển thị Thư mục tại vị trí tương ứng** trong bộ hồ sơ
 *   - Người dùng tạo thành công thư mục **mặc định là Owner** của Thư mục vừa khởi tạo
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B0. Tiền điều kiện: tạo BHS **trống** (`taoThuMuc: false` — thư mục do chính case tạo ra).
 * B1–B3 (thao tác QA). Tab "Cấu trúc hồ sơ" → "Thư mục" → điền **Tên** + **Đơn vị soạn thảo**
 *      (2 trường bắt buộc của modal Thêm thư mục trên BHS này — xem
 *      `KHO-TAI-LIEU.MODAL-TAO-THU-MUC.md` mục 5) → "Xác nhận".
 *      ✅ Mong muốn 1 (toast "Thành công") được assert ngay trong bước này.
 * MM2. Mong muốn 3 — mở lại BHS, dòng thư mục hiển thị ở **gốc BHS** (`ant-table-row-level-0`)
 *      với tên `"<mã prefix>. <tên>"`.
 * MM3. Mong muốn 2 — mở màn "Cập nhật thư mục" và đối chiếu **Tên** + **Đơn vị soạn thảo** đúng
 *      như dữ liệu đã nhập (`createThuMuc` trả về dữ liệu đã điền).
 * MM4. Mong muốn 4 — Owner BHS mở "Kiểm tra phân quyền", assert **người tạo** có trong cột
 *      **Quyền Owner** của thư mục vừa tạo. Tên hiển thị của người tạo lấy **động** bằng
 *      `layTenHienThiNguoiDangDangNhap(creatorPage)` (hover avatar ở màn danh sách) — không
 *      hard-code tên vì tên user có thể bị đổi trong lúc test.
 * MM5. Mong muốn 3 (phần "vị trí tương ứng") — tạo tiếp 1 **thư mục con** bên trong thư mục vừa
 *      tạo, assert nó ở `ant-table-row-level-1` và **nằm ngay dưới** dòng cha.
 *
 * ── 4 TEST = 4 BỘ HỒ SƠ RIÊNG (mỗi test tự dựng dữ liệu của nó) ──────────────
 * | # | Vai tạo thư mục | Ai dựng BHS + kiểm tra Owner | Quyền của vai tại BHS     | Trạng thái BHS |
 * |---|-----------------|------------------------------|---------------------------|----------------|
 * | 1 | Thủ thư (ecm01) | chính nó                     | Owner (tự tạo BHS)        | Khai báo       |
 * | 2 | ITAdmin (ecm09) | chính nó                     | Owner (tự tạo BHS)        | Khai báo       |
 * | 3 | ecm06           | Thủ thư                      | Owner — cấp ở BHS         | Hoạt động      |
 * | 4 | ecm05           | Thủ thư                      | Tạo mới (ADD) — cấp ở BHS | Hoạt động      |
 *
 * ⚠️ Test 3–4 dùng **Thủ thư** (Owner BHS) để kiểm tra Owner của thư mục và thuộc tính đã lưu:
 *    vai không phải Owner BHS có thể không có `btn-more` để mở modal Phân quyền nâng cao
 *    (`KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md` mục 2 & 5). Phần "thư mục hiển thị đúng vị trí" thì
 *    vẫn kiểm tra **bằng chính vai tạo** — đó là điều QA quan sát ngay sau khi bấm Xác nhận.
 */

const runTest = async (
  creatorPage: Page,
  checkerPage: Page,
  duLieu: DuLieu,
) => {
  const tenThuMucCon = `${duLieu.tenThuMuc}-CON`;

  // Tên hiển thị của người tạo — lấy ĐỘNG từ avatar (tên user có thể bị đổi trong lúc test)
  const tenNguoiTao = await layTenHienThiNguoiDangDangNhap(creatorPage);

  // B1–B3 + Mong muốn 1 (toast "Thành công")
  await taoThuMucDayDuThongTin(creatorPage, duLieu, duLieu.tenThuMuc);

  // Mong muốn 3 — hiển thị ở gốc BHS
  await expectThuMucHienThiDungViTri(creatorPage, duLieu, duLieu.tenThuMuc);

  // Mong muốn 2 — thuộc tính đã được lưu (tên đúng, trường bắt buộc có giá trị)
  await expectThuocTinhThuMucDaLuu(checkerPage, duLieu, duLieu.tenThuMuc);

  // Mong muốn 4 — người tạo là Owner của thư mục
  await expectNguoiTaoLaOwnerThuMuc(
    checkerPage,
    duLieu,
    duLieu.tenThuMuc,
    tenNguoiTao,
  );

  // Mong muốn 3 (phần "vị trí tương ứng") — thư mục con phải nằm ngay dưới thư mục cha
  await taoThuMucDayDuThongTin(creatorPage, duLieu, tenThuMucCon, {
    parentName: duLieu.tenThuMuc,
  });
  await expectThuMucHienThiDungViTri(creatorPage, duLieu, tenThuMucCon, {
    tenCha: duLieu.tenThuMuc,
  });
};

/* -------------------------------------------------------------------------- */
/* Vai tự tạo BHS (Thủ thư / ITAdmin)                                          */
/* -------------------------------------------------------------------------- */

const runTestOwnerBoHoSo = async (page: Page, maCase: string) => {
  const duLieu = await dungDuLieuBoHoSo(page, {
    maCase: `163-${maCase}`,
    taoThuMuc: false, // thư mục do chính case tạo ra
  });
  await runTest(page, page, duLieu);
};

/** TEST 1 — Thủ thư (ecm01) tự tạo BHS rồi tạo thư mục. */
test(
  "UC22 163 - Kiểm tra thêm mới thư mục thành công khi nhập đầy đủ thông tin bắt buộc - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTestOwnerBoHoSo(librarian, "TT");
  },
);

/** TEST 2 — ITAdmin (ecm09). Dữ liệu & thao tác y hệt TEST 1. */
test(
  "UC22 163 - Kiểm tra thêm mới thư mục thành công khi nhập đầy đủ thông tin bắt buộc - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTestOwnerBoHoSo(admin, "AD");
  },
);

/* -------------------------------------------------------------------------- */
/* Vai được phân quyền ở BHS — Thủ thư dựng BHS + kiểm tra, vai kia tạo thư mục */
/* -------------------------------------------------------------------------- */

const runTestVaiDuocPhanQuyen = async (
  librarian: Page,
  userPage: Page,
  maCase: string,
  vai: { account: string; permTestId: string },
) => {
  const duLieu = await dungDuLieuBoHoSo(librarian, {
    maCase: `163-${maCase}`,
    taoThuMuc: false,
    quyenBanDau: { permTestId: vai.permTestId, account: vai.account },
    chuyenSangHoatDong: true,
  });
  await runTest(userPage, librarian, duLieu);
};

/** TEST 3 — `ecm06` được phân quyền **Owner** của BHS. */
test(
  "UC22 163 - Kiểm tra thêm mới thư mục thành công khi nhập đầy đủ thông tin bắt buộc - Người dùng có quyền Owner ở BHSecm06",
  async ({ librarian, ecm06 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm06, "OWN", {
      account: "ecm06",
      permTestId: DOC_PERM.OWNER,
    });
  },
);

/** TEST 4 — `ecm05` được phân quyền **Tạo mới** ở BHS. */
test(
  "UC22 163 - Kiểm tra thêm mới thư mục thành công khi nhập đầy đủ thông tin bắt buộc - Người dùng có quyền Tạo mới ở BHSecm05",
  async ({ librarian, ecm05 }) => {
    await runTestVaiDuocPhanQuyen(librarian, ecm05, "ADD", {
      account: "ecm05",
      permTestId: DOC_PERM.ADD,
    });
  },
);
