import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import { dungDuLieuBoHoSo, DuLieu } from "./1.4.1.setup";
import {
  expectIndexThuMucTuSinh,
  taoThuMucDayDuThongTin,
} from "./1.4.1.steps";

/**
 * ============================================================================
 * UC22 — 1.4.1 Tạo thư mục trong Cấu trúc hồ sơ
 * Case 166 (QA): Kiểm tra giá trị mặc định trường Index thư mục
 * ============================================================================
 *
 * ── NGUYÊN VĂN TESTCASE ─────────────────────────────────────────────────────
 * Tiền điều kiện: Đang ở màn **"Thêm thư mục"**
 * Thao tác:
 *   1. Truy cập màn hình Thêm thư mục
 *   2. Quan sát trường Index thư mục
 * Mong muốn:
 *   Hệ thống **tự động sinh**
 *   - **Không cho phép chỉnh sửa**
 *   - Hiển thị **theo thứ tự tạo thư mục** trong cấu trúc hồ sơ, hiển thị bằng **chữ cái bắt đầu
 *     từ A**
 *
 * Tiền điều kiện chung của mục 1.4.1: xem `1.4.1.md`.
 *
 * ── TRƯỜNG "INDEX THƯ MỤC" LÀ CÁI NÀO ───────────────────────────────────────
 * Modal "Thêm thư mục" không có field **nhãn riêng** tên "Index": mã hệ thống tự sinh nằm ngay
 * trong ô **"Tên"** — ô này gồm 2 input: `txt-ma-thu-muc` (**disabled**, hiển thị mã `A`, `B`,
 * `A.1`…) + `txt-ten-thu-muc` (nhập tên).
 * ✅ Khảo sát lại bằng MCP 2026-07-30: cả 2 input **đã có `data-testid`** → `getIndexThuMuc` dùng
 * `txt-ma-thu-muc`, không còn bám id wrapper/placeholder.
 *
 * ── CÁC BƯỚC SCRIPT THỰC HIỆN ───────────────────────────────────────────────
 * B0. Tiền điều kiện: tạo BHS **trống** (`taoThuMuc: false`) → cấu trúc hồ sơ chưa có thư mục nào.
 * B1. Mở màn "Thêm thư mục" (dropdown "Tạo mới" → Thư mục) — **không điền, không lưu**.
 * B2. Quan sát trường Index:
 *     - có giá trị **`A`** → hệ thống tự sinh, bắt đầu từ chữ cái A;
 *     - `toBeDisabled()` → không cho phép chỉnh sửa.
 * B3. Tạo thật thư mục đó (điền đủ trường bắt buộc → Xác nhận) để cấu trúc hồ sơ có 1 thư mục.
 * B4. Mở lại màn "Thêm thư mục" → Index giờ phải là **`B`** → chứng minh "hiển thị theo thứ tự tạo
 *     thư mục trong cấu trúc hồ sơ", vẫn disabled.
 *
 * ⚠️ Không assert index của **thư mục con** (dạng `A.1`): định dạng đó chưa được khảo sát trực tiếp
 *    ở modal Thêm thư mục (bảng Cấu trúc hồ sơ thì đã thấy tài liệu con hiển thị `A.1 <tên>`).
 *    Cần phủ thì mình bổ sung sau khi khảo sát — `expectIndexThuMucTuSinh` đã có sẵn tham số
 *    `parentName` cho việc đó.
 *
 * ── 2 TEST ──────────────────────────────────────────────────────────────────
 * | # | Vai             | Trạng thái BHS | Ghi chú                                       |
 * |---|-----------------|----------------|-----------------------------------------------|
 * | 1 | Thủ thư (ecm01) | Khai báo       | tự tạo BHS nên là Owner                       |
 * | 2 | ITAdmin (ecm09) | Khai báo       | y hệt TEST 1                                  |
 *
 * Chỉ 2 vai theo quy ước tối thiểu (`tests/README.md` mục 6.4): giá trị Index do **hệ thống sinh
 * theo cấu trúc hồ sơ**, không phụ thuộc vai đang đăng nhập. Muốn phủ thêm vai được phân quyền
 * (Owner / Tạo mới ở BHS) thì dùng lại `runTestVaiDuocPhanQuyen` như case 153/163.
 */

const runTest = async (page: Page, duLieu: DuLieu) => {
  // B1 + B2 — BHS chưa có thư mục nào → Index đầu tiên phải là "A"
  await expectIndexThuMucTuSinh(page, duLieu, "A");

  // B3 — tạo thật thư mục "A"
  await taoThuMucDayDuThongTin(page, duLieu, duLieu.tenThuMuc);

  // B4 — thư mục tiếp theo phải là "B" (theo thứ tự tạo trong cấu trúc hồ sơ)
  await expectIndexThuMucTuSinh(page, duLieu, "B");
};

const runTestOwnerBoHoSo = async (page: Page, maCase: string) => {
  const duLieu = await dungDuLieuBoHoSo(page, {
    maCase: `166-${maCase}`,
    taoThuMuc: false, // BHS phải trống để Index đầu tiên là "A"
  });
  await runTest(page, duLieu);
};

/** TEST 1 — Thủ thư (ecm01). */
test(
  "UC22 166 - Kiểm tra giá trị mặc định trường Index thư mụ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 166 - Kiểm tra giá trị mặc định trường Index thư mục - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTestOwnerBoHoSo(admin, "AD");
  },
);
