import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import { dungDuLieuCapNhatTaiLieu } from "./1.4.5.setup";
import {
  moLaiTaiLieuRoiDoiTen,
  expectTenTaiLieuMoiDaLuu,
} from "./1.4.5.steps";

/**
 * UC?? — 1.4.5.529
 * **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 tài liệu
 * 2. Mở lại tài liệu đã 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.5.md`](./1.4.5.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 tài liệu** 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à 1 trong 2 trường bắt
 *   buộc của tài liệu (`Tên tài liệu`, `Loại tài liệu` — `MODAL-TAO-TAI-LIEU.md` mục 2) và là trường
 *   duy nhất case chủ động thay đổi; `Loại tài liệu` đã được `createTaiLieu` điền lúc tạo.
 * - **"Button Lưu" của màn chi tiết Tài liệu có nhãn "Lưu lại"** với testId `btn-save`
 *   (`MODAL-TAO-TAI-LIEU.md` mục 6) — khác màn Cập nhật **thư mục** (nút "Xác nhận" ở footer, xem
 *   case 1.4.4.454). 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.5.steps.ts`](./1.4.5.steps.ts)).
 * - **Tài liệu tạo ở gốc BHS, không tạo thêm thư mục / tài liệu nào khác**: assert "tên cũ đã biến
 *   mất" khỏi bảng Cấu trúc hồ sơ chỉ đúng nghĩa khi trong BHS chỉ có đúng 1 item — đổi tên chứ
 *   không nhân bản.
 * - **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 chi tiết Tài liệu (tiêu đề + trường `Tên tài liệu` = 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".
 * - **Luôn chủ động mở tab "Thông tin"** trước khi sửa (`openTabThongTinTaiLieu`): tab đang active
 *   khi mở lại tài liệu **phụ thuộc việc tài liệu có file mềm hay không**
 *   (`KHO-TAI-LIEU.TAB-TAI-LIEU-SO.md` mục 2) — tài liệu của case này chưa có file nên mặc định
 *   **chưa được khảo sát**, không dựa vào 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. **Chưa khảo sát**: màn chi tiết Tài liệu render `txt-ten-tai-lieu` thành **input sửa được** hay
 *    **text đã bị khoá** (một số field của BHS bị khoá sau khi lưu — `KHO-TAI-LIEU.md` mục 4.5).
 *    Case 1.4.2.261 chỉ chứng minh testId này **đọc được giá trị** trên màn chi tiết, chưa chứng
 *    minh sửa được. Nếu app khoá trường này thì case fail ngay ở bước điền tên mới — đó là **kết quả
 *    test** cần QA/DEV kết luận (tiền điều kiện QA khẳng định vai này sửa được), không phải lỗi script.
 * 2. **Chưa khảo sát**: bấm "Lưu lại" ở màn chi tiết Tài liệu có bắn toast `"Thành công"` giống lúc
 *    tạo mới hay không. Nếu app dùng thông báo khác, sửa assert toast trong `1.4.5.steps.ts`
 *    (`expectToastThanhCong`) và cập nhật `MODAL-TAO-TAI-LIEU.md`.
 * 3. 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 tài
 *    liệu khác, quá độ dài cho phép…) → **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 tài liệu trùng trong cùng BHS hay không.
 * 4. Case không assert **Mã tài liệu** (`<Mã BHS>/TL001`) giữ nguyên sau khi đổi tên — **chưa khảo
 *    sát**; nếu QA yêu cầu thì bổ sung assert vào `expectTenTaiLieuMoiDaLuu` (⚠️ mã tài liệu là text
 *    read-only **chưa có testId**, xem `MODAL-TAO-TAI-LIEU.md` mục 2).
 */

const runTest = async (nguoiTaoBoHoSo: Page) => {
  // --- Thao tác 1: tạo BHS + 1 tài liệu ở gốc BHS ---
  const duLieu = await dungDuLieuCapNhatTaiLieu(nguoiTaoBoHoSo, {
    maCase: "529",
  });

  // --- Thao tác 2: mở lại tài liệu → sửa tên → bấm "Lưu lại" ---
  await moLaiTaiLieuRoiDoiTen(nguoiTaoBoHoSo, duLieu);

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

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