import { Page } from "@playwright/test";
import { test, expect, ACCOUNT } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  PREFIX_SHORTCUT,
  chuyenHoatDong,
  createBoHoSo,
  createTaiLieu,
  layTenCacDongCauTruc,
  moRongToanBoCayCauTruc,
  openBoHoSo,
  openTabCauTrucHoSo,
  phanTichDongCauTruc,
  taoShortcutTaiLieu,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";

/**
 * UC?? — 1.4.10.734
 * **Tạo shortcut thành công với dữ liệu hợp lệ**
 *
 * Thao tác (nguyên văn):
 * 1. Tạo 1 bộ hồ sơ, chuyển hoạt động bộ hồ sơ này.
 * 2. Tạo bộ hồ sơ thứ 2. Tạo 1 tài liệu trong bộ hồ sơ thứ 2, bấm vào chức năng "Tạo shortcut".
 * 3. Modal Tạo mới Shortcut hiển thị: ô tên (placeholder "Nhập tên shortcut") mặc định là
 *    `Shortcut of <Tên gốc>`; tiếp theo là 1 dropdown (không có testId, placeholder "Vui lòng chọn")
 *    — search bằng tên bộ hồ sơ 1; ô cuối là tree-dropdown — chọn item tên giống tên bộ hồ sơ.
 * 4. Điền đủ thông tin → bấm "Lưu lại" → hiện notice "Tạo shortcut thành công".
 * 5. Mở lại hồ sơ 1: có 1 tài liệu với tên đã điền (hoặc mặc định) là 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.10.md`](./1.4.10.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
 *
 * - **Dựng dữ liệu thẳng trong case** (không tách `setup`/`steps`): mục 1.4.10 hiện chỉ có case này,
 *   tách file chỉ thêm tầng gián tiếp. Thao tác màn hình (mở modal shortcut, điền 3 ô, lưu, chờ
 *   toast) thì để ở `taoShortcutTaiLieu` trong `KHO-TAI-LIEU.functions.ts` vì nó là thao tác **thuần
 *   màn hình**, case sau dùng lại được.
 * - **BHS 1 = hồ sơ đích, được `chuyenHoatDong`** đúng như thao tác 1 mô tả. BHS 2 (nguồn) giữ
 *   nguyên `Khai báo` — QA không yêu cầu chuyển, và vai thao tác là người tạo nên vẫn mở lại được
 *   (`KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md` mục 1).
 * - **Không đổi tên shortcut**: mô tả cho phép "tên đã điền (hoặc default)". Giữ tên mặc định là
 *   phương án kiểm được **nhiều thứ hơn** — vừa kiểm quy tắc `"Shortcut of " + <tên gốc>`, vừa kiểm
 *   app lưu đúng tên đang hiển thị. (Muốn kiểm nhánh tự nhập thì truyền `opts.tenShortcut` — đó là
 *   **case riêng**, chưa viết.)
 * - **Assert tên mặc định** ngay khi modal mở (giá trị `taoShortcutTaiLieu` trả về) — đây là kỳ vọng
 *   duy nhất của thao tác 3 mà bảng ở bước 5 không phản ánh được.
 * - **Vị trí lưu = gốc BHS 1**: tree-select chọn item trùng tên BHS đích (mặc định của
 *   `taoShortcutTaiLieu`), khớp mô tả "chọn item có tên giống với tên bộ hồ sơ".
 * - **Assert kết quả ở bảng "Cấu trúc hồ sơ" của BHS 1**, đối chiếu theo **tên đã tách mã prefix**
 *   (`phanTichDongCauTruc`) chứ không lọc dòng theo chuỗi con: tên shortcut **chứa nguyên tên tài
 *   liệu gốc** nên mọi cách khớp `hasText` đều dính nhầm. Gọi `moRongToanBoCayCauTruc` trước khi đọc
 *   vì bảng chỉ mở sẵn tới cấp 1 (`KHO-TAI-LIEU.md` mục 4.4).
 * - **Kiểm thêm: BHS 2 vẫn còn tài liệu gốc** — bắt lỗi app *chuyển* tài liệu sang BHS 1 thay vì tạo
 *   shortcut; nhìn riêng BHS 1 thì không phát hiện được.
 * - **Không kiểm** cột "Shortcut" của bảng, mã tài liệu gốc, hay việc mở shortcut ra có trỏ về tài
 *   liệu gốc hay không — QA không nêu trong mô tả này; đó là **case riêng**, chưa viết.
 * - **2 test (Thủ thư + Admin)** theo `tests/README.md` mục 6.4; mỗi vai tự dựng 2 BHS riêng để chạy
 *   song song được.
 *
 * ## Điểm cần QA/DEV chốt
 *
 * 1. 🚨 **Modal "Tạo mới Shortcut" chưa được khảo sát bằng MCP** và **không có `data-testid` nào**
 *    (theo mô tả 2026-08-14) → toàn bộ locator bám placeholder + class AntD:
 *    ô tên `input[placeholder="Nhập tên shortcut"]`, BHS đích `.ant-select:not(.ant-tree-select)`
 *    đầu tiên, vị trí lưu `.ant-tree-select` đầu tiên, nút `"Lưu lại"` theo nhãn. Chạy thật hỏng ở
 *    bước nào → khảo sát bằng `/khao-sat-man-hinh` rồi thay bằng testId thật, **đừng** vá bằng
 *    selector đoán. → DEV bổ sung testId cho modal này.
 * 2. **Chưa rõ nhãn của 2 ô dropdown** (mô tả chỉ cho biết placeholder chung `"Vui lòng chọn"`) →
 *    hàm đang giả định thứ tự hiển thị: ô select là **Bộ hồ sơ đích**, tree-select là **vị trí lưu**
 *    bên trong BHS đó. Nếu app đảo thứ tự / thêm ô thì phải sửa `taoShortcutTaiLieu`.
 * 3. **Tiền tố `"Shortcut of "` có phụ thuộc ngôn ngữ giao diện không?** — đang hard-code trong hằng
 *    `PREFIX_SHORTCUT`, đổi thì sửa đúng 1 chỗ.
 * 4. **Shortcut hiển thị trong bảng Cấu trúc hồ sơ như 1 dòng tài liệu bình thường?** Case đang giả
 *    định vậy (mô tả bước 5: "có 1 tài liệu 1 với tên đã điền"). Nếu app hiển thị khác (icon riêng,
 *    tên kèm hậu tố, nằm ở cột "Shortcut") thì assert phải sửa theo.
 * 5. **BHS đích có bắt buộc ở trạng thái "Hoạt động" không?** Thao tác 1 yêu cầu chuyển hoạt động
 *    nên case làm theo, nhưng chưa rõ đó là **điều kiện của chức năng** hay chỉ là bối cảnh.
 */

const runTest = async (page: Page) => {
  const pw = new PW(page);
  const base = `AT-1.4.10-734-${Date.now()}`;
  // ⚠️ Không tên nào được là tiền tố của tên khác (`getCauTrucRow` khớp chuỗi con) — xem `1.4.10.md`
  const tenBoHoSo1 = `${base}-HS1`;
  const tenBoHoSo2 = `${base}-HS2`;
  const tenTaiLieu = `${base}-TL1`;

  // --- Thao tác 1: tạo bộ hồ sơ 1 (đích) + chuyển hoạt động ---
  const urlBoHoSo1 = await createBoHoSo(page, pw, tenBoHoSo1);
  await test.step(`Thao tác: chuyển hoạt động bộ hồ sơ "${tenBoHoSo1}"`, async () => {
    await chuyenHoatDong(page); // BHS vừa tạo đang mở sẵn
  });

  // --- Thao tác 2: bộ hồ sơ 2 (nguồn) + 1 tài liệu bên trong ---
  const urlBoHoSo2 = await createBoHoSo(page, pw, tenBoHoSo2);
  await createTaiLieu(page, pw, urlBoHoSo2, tenTaiLieu);

  // --- Thao tác 2-4: "Tạo shortcut" từ menu dòng tài liệu → điền modal → Lưu lại ---
  // Toast "Tạo shortcut thành công" (thao tác 4) do `taoShortcutTaiLieu` assert bên trong.
  let tenShortcut = "";
  await test.step(`Thao tác: tạo shortcut của "${tenTaiLieu}" sang BHS "${tenBoHoSo1}"`, async () => {
    await openTabCauTrucHoSo(page); // `createTaiLieu` đã trả màn về BHS 2
    const tenMacDinh = await taoShortcutTaiLieu(page, tenTaiLieu, tenBoHoSo1);

    // Mong muốn (thao tác 3): tên mặc định = "Shortcut of " + tên tài liệu gốc
    expect(tenMacDinh, {
      message:
        `Lỗi: ô "Nhập tên shortcut" điền sẵn "${tenMacDinh}", mong đợi ` +
        `"${PREFIX_SHORTCUT}${tenTaiLieu}"`,
    }).toBe(`${PREFIX_SHORTCUT}${tenTaiLieu}`);
    tenShortcut = tenMacDinh;
  });

  // --- Thao tác 5: mở lại bộ hồ sơ 1 → phải có tài liệu tên shortcut ---
  await test.step(`Mong muốn: BHS "${tenBoHoSo1}" có tài liệu "${tenShortcut}"`, async () => {
    await openBoHoSo(page, urlBoHoSo1);
    await openTabCauTrucHoSo(page);
    await moRongToanBoCayCauTruc(page);

    const dong = phanTichDongCauTruc(await layTenCacDongCauTruc(page));
    const moTaBang = dong.map((d) => `"${d.hienThi}"`).join(" | ");

    expect(
      dong.some((d) => d.ten === tenShortcut),
      {
        message:
          `Lỗi: tạo shortcut xong nhưng bảng Cấu trúc hồ sơ của BHS "${tenBoHoSo1}" không có dòng ` +
          `nào tên "${tenShortcut}". Các dòng đang có (${dong.length}): [${moTaBang || "không có"}]`,
      },
    ).toBe(true);
  });

  // --- Mong muốn bổ sung: tài liệu gốc vẫn còn ở BHS 2 (shortcut là trỏ tới, không phải chuyển) ---
  await test.step(`Mong muốn: BHS "${tenBoHoSo2}" vẫn còn tài liệu gốc "${tenTaiLieu}"`, async () => {
    await openBoHoSo(page, urlBoHoSo2);
    await openTabCauTrucHoSo(page);
    await moRongToanBoCayCauTruc(page);

    const dong = phanTichDongCauTruc(await layTenCacDongCauTruc(page));
    expect(
      dong.some((d) => d.ten === tenTaiLieu),
      {
        message:
          `Lỗi: sau khi tạo shortcut, tài liệu gốc "${tenTaiLieu}" không còn trong BHS ` +
          `"${tenBoHoSo2}" (app chuyển tài liệu thay vì tạo shortcut?). Các dòng đang có: ` +
          `[${dong.map((d) => `"${d.hienThi}"`).join(" | ") || "không có"}]`,
      },
    ).toBe(true);
  });
};

test(
  "UC?? 1.4.10.734 - Tạo shortcut thành công với dữ liệu hợp lệ - Thủ thư" +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTest(librarian);
  },
);

test(
  "UC?? 1.4.10.734 - Tạo shortcut thành công với dữ liệu hợp lệ - Admin" +
    ACCOUNT.ADMIN,
  async ({ admin }) => {
    await runTest(admin);
  },
);
