import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createTaiLieu,
  createThuMuc,
  chuyenHoatDong,
} from "../../src/screen-instructions/KHO-TAI-LIEU.functions";

/**
 * Dựng dữ liệu tiền điều kiện dùng chung cho bộ case **1.4.7 — Xóa thư mục / tài liệu trong
 * Cấu trúc hồ sơ**.
 *
 * ⚠️ Mã UC của mục chưa được QA chốt → prefix dữ liệu tạm là `AT-1.4.7-...`
 * (đổi khi chốt được UC — xem `tests/1.4.7/1.4.7.md`).
 *
 * Đọc `tests/1.4.7/1.4.7.md` trước khi sửa file này.
 */

/** Quyền cấp riêng tại **1 thư mục** (thư mục đó được "Đặt quyền độc lập" rồi thêm người/nhóm) */
export type QuyenThuMuc = {
  /** Số thứ tự thư mục (1-based, theo thứ tự tạo) */
  thuMucSo: number;
  /** Dùng hằng `FOLDER_PICKER` (`pp-multi-usersRight*`) */
  permTestId: string;
  /** Account id hoặc **tên nhóm** (vd `GROUP.ECM06`) */
  account: string;
};

export type DungDuLieuXoaThuMucOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"616"` → `AT-1.4.7-616-<ts>` */
  maCase: string;
  /** Số thư mục cần tạo ở gốc BHS (mỗi thư mục chứa đúng 1 tài liệu) */
  soThuMuc: number;
  /**
   * Cấp quyền cho 1 người dùng / nhóm **ngay khi tạo BHS** — dùng khi vai cần test không phải
   * người tạo BHS. Thư mục / tài liệu bên trong sẽ kế thừa quyền này.
   */
  quyenBoHoSo?: { permTestId: string; account: string };
  /**
   * Cấp quyền **chỉ tại một số thư mục**: thư mục đó được **"Đặt quyền độc lập"** rồi thêm
   * người/nhóm vào trường quyền tương ứng.
   *
   * ⚠️ **Không** xoá chip kế thừa (`clearInherited` để mặc định `false`) → người tạo BHS và người
   * được `quyenBoHoSo` **vẫn giữ quyền** tại thư mục đó (`MODAL-TAO-THU-MUC.md` mục 4b).
   */
  quyenThuMuc?: QuyenThuMuc[];
  /**
   * Tạo thêm **1 tài liệu ở gốc BHS** (không nằm trong thư mục nào) và cấp quyền **trực tiếp trên
   * chính tài liệu đó** cho 1 người dùng / nhóm.
   *
   * Tài liệu được tick **"Break quyền riêng"** (`quyenRieng: true`) — cấp quyền trực tiếp lên 1
   * TM/TL buộc phải tách kế thừa trước (`PHAN-QUYEN-THEO-VAI.md` mục 4).
   * ⚠️ **Không** xoá chip kế thừa → người tạo BHS và người được `quyenBoHoSo` vẫn giữ quyền tại
   * tài liệu này (`MODAL-TAO-TAI-LIEU.md` mục 4).
   */
  taiLieuGoc?: { permTestId: string; account: string };
  /** Chuyển BHS sang "Hoạt động" — bắt buộc khi vai cần test không phải người tạo BHS */
  chuyenSangHoatDong?: boolean;
};

/** 1 thư mục + tài liệu nằm bên trong nó */
export type ThuMucCoTaiLieu = {
  /** Số thứ tự thư mục (1-based) */
  thuMucSo: number;
  tenThuMuc: string;
  tenTaiLieu: string;
};

export type DuLieuXoaThuMuc = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS */
  recordUrl: string;
  /** Tên BHS */
  tenBoHoSo: string;
  /** Các thư mục đã tạo (theo đúng thứ tự tạo), mỗi thư mục chứa 1 tài liệu */
  thuMuc: ThuMucCoTaiLieu[];
  /** Tên tài liệu ở **gốc BHS** — chỉ có khi truyền `opts.taiLieuGoc` */
  tenTaiLieuGoc?: string;
};

/**
 * Cấu trúc dữ liệu dựng ra (ví dụ `soThuMuc: 4` + `taiLieuGoc`):
 *
 *     BHS  (Owner = `page` đang đăng nhập; + `quyenBoHoSo` nếu có)
 *      ├─ ...-TM1 ─ ...-TL1        ← KẾ THỪA quyền BHS
 *      ├─ ...-TM2 ─ ...-TL2        ← KẾ THỪA quyền BHS
 *      ├─ ...-TM3 ─ ...-TL3        ← quyền ĐỘC LẬP nếu có `quyenThuMuc` cho thư mục số 3
 *      ├─ ...-TM4 ─ ...-TL4        ← quyền ĐỘC LẬP nếu có `quyenThuMuc` cho thư mục số 4
 *      └─ ...-TL-GOC               ← tài liệu ở gốc BHS, quyền ĐỘC LẬP (chỉ khi có `taiLieuGoc`)
 *
 * Thứ tự tạo bám đúng mô tả của QA: **toàn bộ thư mục** → **tài liệu ở gốc BHS** → **tài liệu bên
 * trong từng thư mục** → `chuyenHoatDong` (nếu có). Thứ tự này không ảnh hưởng cấu trúc thu được
 * (mã prefix vẫn là `A`, `B`… cho thư mục và `A.1`, `B.1`… cho tài liệu bên trong).
 *
 * `recordUrl` được lưu **trước khi** tạo thư mục/tài liệu (`KHO-TAI-LIEU.md` mục 9.3): tạo tài liệu
 * xong `page.url()` bị thay bằng URL của tài liệu vừa tạo.
 */
export const dungDuLieuXoaThuMuc = async (
  page: Page,
  opts: DungDuLieuXoaThuMucOptions,
): Promise<DuLieuXoaThuMuc> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-1.4.7-${opts.maCase}-${ts}`;

  const duLieu: DuLieuXoaThuMuc = {
    recordUrl: "",
    tenBoHoSo: goc,
    thuMuc: Array.from({ length: opts.soThuMuc }, (_, i) => ({
      thuMucSo: i + 1,
      tenThuMuc: `${goc}-TM${i + 1}`,
      tenTaiLieu: `${goc}-TL${i + 1}`,
    })),
    // ⚠️ Không tên nào được là tiền tố của tên khác (`1.4.7.md` mục 1): `-TL-GOC` không trùng
    // tiền tố với `-TL1`…`-TL4` vì `getCauTrucRow` khớp theo chuỗi con.
    tenTaiLieuGoc: opts.taiLieuGoc ? `${goc}-TL-GOC` : undefined,
  };

  const quyenCuaThuMuc = (thuMucSo: number) =>
    opts.quyenThuMuc?.find((q) => q.thuMucSo === thuMucSo);

  const moTaQuyenBHS = opts.quyenBoHoSo
    ? ` (cấp ${opts.quyenBoHoSo.permTestId} cho "${opts.quyenBoHoSo.account}")`
    : "";
  const moTaQuyenTM = (opts.quyenThuMuc ?? [])
    .map((q) => `TM${q.thuMucSo}→${q.account}`)
    .join(", ");

  const moTaTaiLieuGoc = opts.taiLieuGoc
    ? ` + 1 tài liệu ở gốc BHS (cấp ${opts.taiLieuGoc.permTestId} cho "${opts.taiLieuGoc.account}")`
    : "";

  await test.step(
    `Tiền điều kiện: tạo BHS "${goc}"${moTaQuyenBHS} + ${opts.soThuMuc} thư mục, mỗi thư mục 1 tài liệu` +
      (moTaQuyenTM ? ` (quyền riêng tại thư mục: ${moTaQuyenTM})` : "") +
      moTaTaiLieuGoc,
    async () => {
      duLieu.recordUrl = await createBoHoSo(page, pw, goc, {
        peoplePickers: opts.quyenBoHoSo
          ? [
              {
                testId: opts.quyenBoHoSo.permTestId,
                account: opts.quyenBoHoSo.account,
              },
            ]
          : undefined,
      });

      // --- toàn bộ thư mục (thư mục có `quyenThuMuc` thì đặt quyền độc lập rồi thêm người/nhóm) ---
      for (const tm of duLieu.thuMuc) {
        const quyen = quyenCuaThuMuc(tm.thuMucSo);
        await createThuMuc(page, pw, duLieu.recordUrl, tm.tenThuMuc, {
          quyenDocLap: !!quyen,
          perm: quyen
            ? { account: quyen.account, permTestId: quyen.permTestId }
            : undefined,
        });
      }

      // --- tài liệu ở gốc BHS, có quyền cấp trực tiếp trên chính nó ---
      if (opts.taiLieuGoc && duLieu.tenTaiLieuGoc) {
        await createTaiLieu(page, pw, duLieu.recordUrl, duLieu.tenTaiLieuGoc, {
          quyenRieng: true,
          perm: [
            {
              account: opts.taiLieuGoc.account,
              permTestId: opts.taiLieuGoc.permTestId,
            },
          ],
        });
      }

      // --- 1 tài liệu bên trong mỗi thư mục (kế thừa quyền của thư mục chứa nó) ---
      for (const tm of duLieu.thuMuc) {
        await createTaiLieu(page, pw, duLieu.recordUrl, tm.tenTaiLieu, {
          folderName: tm.tenThuMuc,
        });
      }

      if (opts.chuyenSangHoatDong) {
        await chuyenHoatDong(page, duLieu.recordUrl);
      }
    },
  );

  return duLieu;
};
