import { Page } from "@playwright/test";
import { test, ACCOUNT } from "../../src/fixture/base-test";
import {
  chuyenHoatDong,
  layTenDoiTuongPhanQuyen,
  layTenHienThiNguoiDangDangNhap,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";
import { dungDuLieu261 } from "./1.4.2.setup";
import {
  expectOwnerTaiLieu,
  expectTaiLieuDaLuuDungDuLieu,
  expectTaiLieuDungViTri,
  taoTaiLieuDuTruongBatBuoc,
  TINH_TRANG,
} from "./1.4.2.steps";

/**
 * UC23 — 1.4.2.261
 * **Kiểm tra thêm mới tài liệu thành công khi nhập đầy đủ các thông tin bắt buộc**
 *
 * Thao tác (nguyên văn):
 * 1. tạo dùng admin 1 bộ hồ sơ mới, phân quyền owner cho ecm05
 * 2. tạo 1 folder 1, phân quyền owner cho ecm06. 1 tài liệu 1 bên trong folder 1.
 *    1 tài liệu 2 ko nằm trong folder nào cả.
 * 3. Kiểm tra sau khi tạo tài liệu xong, các trường dữ liệu khớp với dữ liệu đã nhập,
 *    trạng thái ăn theo trạng thái của bộ hồ sơ.
 * 4. tài liệu1, tài liệu 2 có owner là admin.
 * 5. owner ecm05 tạo 1 tài liệu mới, owner của tài liệu phải hiển thị là ecm05
 * 6. ecm06 tạo 1 tài liệu mới bên trong folder 1, owner của tài liệu phải hiển thị là ecm06
 *
 * **Tiền điều kiện chung của mục** (nguyên văn QA + bảng vai → cách dựng dữ liệu): [`1.4.2.md`](./1.4.2.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
 *
 * - Tài liệu 1 & 2 do **người tạo BHS** tạo khi BHS còn `Khai báo` → Tình trạng mong đợi `Khai báo`.
 * - Trước bước 5–6 phải `chuyenHoatDong`: vai không phải Owner BHS chỉ mở được BHS ở trạng thái
 *   `Hoạt động` (`KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md` mục 1) → 2 tài liệu tạo sau đó có Tình trạng
 *   mong đợi `Hoạt động`.
 * - `ecm06` chỉ có quyền **tại thư mục 1** nên không có nút "Tạo mới" ở toolbar tab Cấu trúc hồ sơ →
 *   tạo tài liệu qua **menu dòng** của thư mục 1 (`moTuMenuDongThuMuc`).
 * - Mọi assert Owner đọc từ modal Phân quyền nâng cao **bằng phiên người tạo BHS** (vai khác không
 *   có `btn-more`).
 * - **Owner chỉ cần "có chứa" người mong đợi**, không assert cột Owner đúng bằng 1 người (người dùng
 *   chốt 2026-08-04): tài liệu mới có thể **còn kế thừa** quyền cấp cha nên cột Owner thường có thêm
 *   người tạo BHS / người được cấp Owner ở BHS hoặc thư mục cha.
 * - **1 test duy nhất**, không phải cặp Thủ thư + Admin như mặc định của dự án: QA ghi rõ "dùng
 *   admin", và 3 vai (`admin` tạo BHS, `ecm05` Owner BHS, `ecm06` Owner thư mục) là **3 người tham
 *   gia trong cùng 1 kịch bản** — tách test riêng sẽ phải dựng lại toàn bộ dữ liệu. Muốn chạy thêm
 *   bằng Thủ thư: đăng ký thêm 1 `test(...)` gọi `runTest(librarian, ecm05, ecm06)`.
 * - Phạm vi "các trường dữ liệu khớp với dữ liệu đã nhập" (người dùng chốt 2026-08-04): chỉ **2
 *   trường bắt buộc** — Tên tài liệu + Loại tài liệu. Muốn phủ thêm field tuỳ chọn (Số hiệu, Đơn vị
 *   gửi/nhận, Người ký, Ghi chú…) thì bổ sung option `fields` cho `createTaiLieu` và mở rộng
 *   `expectTaiLieuDaLuuDungDuLieu`. **Chưa** phủ field ngày và Độ mật / Trạng thái hiển thị vì ràng
 *   buộc cha–con của 2 trường đó chưa khảo sát.
 * - "Trạng thái ăn theo trạng thái của bộ hồ sơ" được hiểu là: tài liệu nhận Tình trạng của BHS
 *   **tại thời điểm tạo**. **Chưa** kiểm tra chiều "BHS chuyển `Hoạt động` thì tài liệu đã tạo trước
 *   đó có đổi trạng thái theo hay không" — muốn phủ thì thêm 1 bước assert lại TL1/TL2 sau
 *   `chuyenHoatDong`.
 *
 * ## Điểm cần QA/DEV chốt
 *
 * 1. Vì chỉ assert "cột Owner **có chứa**" (xem trên) và `ecm05`/`ecm06` đã có quyền Owner ở
 *    BHS/thư mục 1, bước 5–6 **không tách bạch** được "app tự gán người tạo làm Owner" với "chỉ là
 *    quyền kế thừa". Muốn đo riêng điều đó thì cần vai có quyền **Tạo mới (ADD)** mà **không** phải
 *    Owner → nên là **case riêng**, không sửa case này.
 * 2. **Chưa khảo sát**: màn chi tiết Tài liệu render `txt-ten-tai-lieu` / `sel-loai-tai-lieu` thế
 *    nào sau khi lưu (input hay text đã khoá — `KHO-TAI-LIEU.md` mục 4.5).
 *    `docGiaTriTruongTaiLieu` đọc được cả 2 dạng; testId biến mất hẳn thì hàm trả `""` và assert
 *    fail với thông báo rõ → khảo sát bằng `/khao-sat-man-hinh` rồi siết lại locator.
 * 3. **Chưa khảo sát**: `mni-them-tai-lieu` ở **menu dòng thư mục** với vai chỉ có quyền tại thư mục
 *    đó (`ecm06`). Chạy thật mà `ecm06` không thấy mục này → đó là **kết quả test**, báo QA/DEV.
 * 4. **Chưa khảo sát**: `ecm06` mở màn **chi tiết Tài liệu** và đọc được `lbl-modal-title` hay không
 *    (bước kiểm tra TL4 chạy bằng phiên `ecm06`). Nếu bị chặn thì đổi sang phiên người tạo BHS.
 */

const runTest = async (
  nguoiTaoBoHoSo: Page,
  ownerBoHoSo: Page,
  ownerThuMuc: Page,
) => {
  // Tên hiển thị lấy động — bảng quyền chỉ hiện tên, mà tên có thể bị đổi trong lúc test
  // (tests/README.md mục 2)
  const tenNguoiTao = await layTenHienThiNguoiDangDangNhap(nguoiTaoBoHoSo);
  const tenOwnerBoHoSo = await layTenDoiTuongPhanQuyen({
    account: "ecm05",
    page: ownerBoHoSo,
  });
  const tenOwnerThuMuc = await layTenDoiTuongPhanQuyen({
    account: "ecm06",
    page: ownerThuMuc,
  });

  // --- Thao tác 1 + 2 (phần dựng dữ liệu): BHS Owner ecm05 + thư mục 1 Owner ecm06 ---
  const duLieu = await dungDuLieu261(nguoiTaoBoHoSo, "261");

  // --- Thao tác 2 (phần tạo tài liệu): TL1 trong thư mục 1, TL2 ở gốc BHS ---
  const tl1 = await taoTaiLieuDuTruongBatBuoc(
    nguoiTaoBoHoSo,
    duLieu.recordUrl,
    duLieu.tenTaiLieu1,
    { tenThuMucCha: duLieu.tenThuMuc1 },
  );
  const tl2 = await taoTaiLieuDuTruongBatBuoc(
    nguoiTaoBoHoSo,
    duLieu.recordUrl,
    duLieu.tenTaiLieu2,
  );

  // --- Thao tác 3: dữ liệu khớp dữ liệu đã nhập + Tình trạng ăn theo BHS (đang `Khai báo`) ---
  await expectTaiLieuDungViTri(nguoiTaoBoHoSo, duLieu.recordUrl, tl1);
  await expectTaiLieuDaLuuDungDuLieu(
    nguoiTaoBoHoSo,
    duLieu.recordUrl,
    tl1,
    TINH_TRANG.KHAI_BAO,
  );
  await expectTaiLieuDungViTri(nguoiTaoBoHoSo, duLieu.recordUrl, tl2);
  await expectTaiLieuDaLuuDungDuLieu(
    nguoiTaoBoHoSo,
    duLieu.recordUrl,
    tl2,
    TINH_TRANG.KHAI_BAO,
  );

  // --- Thao tác 4: Owner của TL1, TL2 là người tạo BHS ---
  await expectOwnerTaiLieu(nguoiTaoBoHoSo, duLieu.recordUrl, tl1, tenNguoiTao);
  await expectOwnerTaiLieu(nguoiTaoBoHoSo, duLieu.recordUrl, tl2, tenNguoiTao);

  // --- Chuyển BHS sang "Hoạt động" để ecm05 / ecm06 mở được BHS ---
  await test.step('Tiền điều kiện bước 5–6: chuyển Bộ hồ sơ sang "Hoạt động"', async () => {
    await chuyenHoatDong(nguoiTaoBoHoSo, duLieu.recordUrl);
  });

  // --- Thao tác 5: Owner BHS (ecm05) tạo tài liệu → Owner hiển thị là ecm05 ---
  const tl3 = await taoTaiLieuDuTruongBatBuoc(
    ownerBoHoSo,
    duLieu.recordUrl,
    duLieu.tenTaiLieu3,
  );
  await expectTaiLieuDaLuuDungDuLieu(
    ownerBoHoSo,
    duLieu.recordUrl,
    tl3,
    TINH_TRANG.HOAT_DONG,
  );
  await expectOwnerTaiLieu(
    nguoiTaoBoHoSo,
    duLieu.recordUrl,
    tl3,
    tenOwnerBoHoSo,
  );

  // --- Thao tác 6: Owner thư mục 1 (ecm06) tạo tài liệu trong thư mục 1 → Owner là ecm06 ---
  const tl4 = await taoTaiLieuDuTruongBatBuoc(
    ownerThuMuc,
    duLieu.recordUrl,
    duLieu.tenTaiLieu4,
    { tenThuMucCha: duLieu.tenThuMuc1, moTuMenuDongThuMuc: true },
  );
  await expectTaiLieuDungViTri(ownerThuMuc, duLieu.recordUrl, tl4);
  await expectTaiLieuDaLuuDungDuLieu(
    ownerThuMuc,
    duLieu.recordUrl,
    tl4,
    TINH_TRANG.HOAT_DONG,
  );
  await expectOwnerTaiLieu(
    nguoiTaoBoHoSo,
    duLieu.recordUrl,
    tl4,
    tenOwnerThuMuc,
  );
};

test(
  "UC23 1.4.2.261 - Thêm mới tài liệu thành công khi nhập đầy đủ thông tin bắt buộc - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin, ecm05, ecm06 }) => {
    await runTest(admin, ecm05, ecm06);
  },
);
