import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import { dungDuLieuCapNhatThuMuc } from "./1.4.4.setup";
import {
  moLaiThuMucRoiDoiTen,
  expectTenThuMucMoiDaLuu,
} from "./1.4.4.steps";

/**
 * UC?? — 1.4.4.454
 * **Kiểm tra button Lưu khi nhập thông tin hợp lệ**
 *
 * Thao tác (nguyên văn):
 * 1. dùng admin tạo 1 bộ hồ sơ, sau đó tạo 1 thư mục
 * 2. Mở lại thư mục đã tạo, chỉnh sửa lại tên và lưu lại
 * 3. kiểm tra tên mới được lưu thành công
 *
 * **Tiền điều kiện chung của mục** (tiền điều kiện QA + bảng vai → cách dựng dữ liệu):
 * [`1.4.4.md`](./1.4.4.md). File đó **chỉ** chứa tiền điều kiện chung; toàn bộ logic / kỳ vọng /
 * giả định của case này nằm trong khối comment dưới đây.
 *
 * ---
 *
 * ## Cách case này được viết
 *
 * - **Thông tin hợp lệ** ở case này được hiểu là: đổi **Tên** thư mục sang 1 tên mới hợp lệ
 *   (unique, không rỗng), các trường còn lại giữ nguyên giá trị đã lưu. Đây là trường bắt buộc duy
 *   nhất mà case chủ động thay đổi — "Đơn vị soạn thảo" (bắt buộc tuỳ cấu hình Cấu trúc hồ sơ) đã
 *   được `createThuMuc` điền lúc tạo nên không cần điền lại.
 * - **"Button Lưu" trên màn Cập nhật thư mục có nhãn "Xác nhận"** (`MODAL-TAO-THU-MUC.md` mục 5 +
 *   6b — footer là `Xác nhận` / `Hủy`, không có `btn-save` như modal BHS). Case assert nút đó
 *   **visible + enabled** rồi mới bấm; phần "lưu được" đo bằng toast `"Thành công"` +
 *   dữ liệu đọc lại được (xem `1.4.4.steps.ts`).
 * - **Kiểm tra "tên mới được lưu thành công" ở 2 chỗ độc lập**: bảng Cấu trúc hồ sơ (có tên mới,
 *   không còn tên cũ) và mở lại màn Cập nhật thư mục (ô `Tên` = tên mới). Chỉ assert 1 chỗ thì
 *   không tách được "app đã ghi xuống server" với "chỉ đổi text trên bảng".
 * - **Không tạo thêm thư mục nào khác**: assert "tên cũ đã biến mất" chỉ đúng nghĩa khi thư mục
 *   trong BHS là duy nhất — đổi tên chứ không nhân bản.
 * - BHS giữ nguyên trạng thái **`Khai báo`** (không `chuyenHoatDong`): vai thao tác là **người tạo
 *   BHS** nên mở lại được ở cả 2 trạng thái (`PHAN-QUYEN-THEO-VAI.md` mục 1) → không cần thêm bước.
 * - **1 test duy nhất (Admin)**, không phải cặp Thủ thư + Admin như mặc định của dự án: QA ghi rõ
 *   "dùng admin". Muốn chạy thêm bằng Thủ thư: đăng ký thêm
 *   `test("... - Thủ thư" + ACCOUNT.LIBRARIAN, async ({ librarian }) => runTest(librarian))`.
 *
 * ## Điểm cần QA/DEV chốt
 *
 * 1. Case này **chỉ phủ nhánh hợp lệ**. Nhánh "thông tin **không** hợp lệ" (tên rỗng, tên trùng
 *    thư mục khác trong cùng cấp, độ dài tối đa…) → **case riêng**, vì kỳ vọng là message validate
 *    `.ant-form-item-explain-error` chứ không phải toast Thành công. **Chưa khảo sát** app có chặn
 *    tên trùng ở cùng cấp hay không.
 * 2. **Chưa khảo sát**: sau khi bấm "Xác nhận" ở màn *Cập nhật* thư mục, modal có **tự đóng** như
 *    modal *Thêm* thư mục hay không (`MODAL-TAO-THU-MUC.md` mục 6b — bố cục xác nhận qua ảnh QA,
 *    chưa đọc DOM bằng MCP). Script không phụ thuộc điều này: bước kiểm tra mở lại BHS từ
 *    `recordUrl` nên DOM được reset.
 * 3. **Chưa khảo sát**: đổi tên thư mục có làm đổi **Index thư mục** (`txt-ma-thu-muc`) hay không.
 *    Case không assert trường này; nếu QA yêu cầu "mã giữ nguyên sau khi đổi tên" thì bổ sung
 *    assert `getIndexThuMuc` vào `expectTenThuMucMoiDaLuu`.
 */

const runTest = async (nguoiTaoBoHoSo: Page) => {
  // --- Thao tác 1: tạo BHS + 1 thư mục trong đó ---
  const duLieu = await dungDuLieuCapNhatThuMuc(nguoiTaoBoHoSo, {
    maCase: "454",
  });

  // --- Thao tác 2: mở lại thư mục → sửa tên → bấm nút lưu ---
  await moLaiThuMucRoiDoiTen(nguoiTaoBoHoSo, duLieu);

  // --- Thao tác 3: tên mới được lưu thành công ---
  await expectTenThuMucMoiDaLuu(nguoiTaoBoHoSo, duLieu);
};

test(
  "UC?? 1.4.4.454 - Button Lưu hoạt động khi nhập thông tin hợp lệ (đổi tên thư mục) - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
