import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createThuMuc,
  createTaiLieu,
  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 **UC25 — 1.4.6**
 * (Cập nhật quyền của thư mục, tài liệu trong Cấu trúc hồ sơ).
 */

export type DungDuLieuOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"587-TT"` → `AT-UC25-587-TT-<ts>` */
  maCase: string;
  /**
   * Cấp quyền cho 1 người dùng / nhóm **ngay khi tạo BHS** — dùng khi vai thao tác
   * không phải người tạo BHS. Thư mục bên trong sẽ kế thừa quyền này.
   */
  quyenBanDau?: { permTestId: string; account: string };
  /** Tạo thêm 1 thư mục con + 1 tài liệu **bên trong** thư mục (cả hai đang kế thừa quyền) */
  taoItemCon?: boolean;
  /** Chuyển BHS sang "Hoạt động" — bắt buộc khi vai thao tác không phải người tạo BHS */
  chuyenSangHoatDong?: boolean;
};

export type DuLieu = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS */
  recordUrl: string;
  /** Thư mục ở gốc BHS, đang kế thừa quyền */
  tenThuMuc: string;
  /** Thư mục con bên trong `tenThuMuc` (chỉ có khi `taoItemCon`) */
  tenThuMucCon: string;
  /** Tài liệu bên trong `tenThuMuc` (chỉ có khi `taoItemCon`) */
  tenTaiLieuCon: string;
};

/**
 * Cấu trúc dữ liệu dựng ra:
 *
 *     BHS  (Owner = `page` đang đăng nhập; thêm `quyenBanDau` nếu có)
 *      └─ tenThuMuc          ← đang KẾ THỪA quyền của BHS
 *          ├─ tenThuMucCon   ← đang KẾ THỪA quyền của tenThuMuc   (khi taoItemCon)
 *          └─ tenTaiLieuCon  ← đang KẾ THỪA quyền của tenThuMuc   (khi taoItemCon)
 *
 * Vai cần test lấy quyền tại thư mục **qua kế thừa từ BHS**, nhờ vậy thư mục vẫn ở trạng thái
 * "Kế thừa" và vẫn còn nút "Đặt quyền độc lập" để case thao tác.
 */
export const dungDuLieuThuMuc = async (
  page: Page,
  opts: DungDuLieuOptions,
): Promise<DuLieu> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-UC25-${opts.maCase}-${ts}`;
  const duLieu: DuLieu = {
    recordUrl: "",
    tenThuMuc: `${goc}-TM`,
    tenThuMucCon: `${goc}-TMC`,
    tenTaiLieuCon: `${goc}-TL`,
  };

  const moTaQuyen = opts.quyenBanDau
    ? ` (cấp quyền cho "${opts.quyenBanDau.account}")`
    : "";
  const moTaItemCon = opts.taoItemCon ? " + 1 thư mục con + 1 tài liệu" : "";

  await test.step(`Tiền điều kiện: tạo BHS${moTaQuyen} + 1 thư mục kế thừa${moTaItemCon}`, async () => {
    // recordUrl phải lưu TRƯỚC khi tạo thư mục/tài liệu (KHO-TAI-LIEU.md mục 9.3)
    duLieu.recordUrl = await createBoHoSo(page, pw, goc, {
      peoplePickers: opts.quyenBanDau
        ? [
            {
              testId: opts.quyenBanDau.permTestId,
              account: opts.quyenBanDau.account,
            },
          ]
        : undefined,
    });

    await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc);

    if (opts.taoItemCon) {
      await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMucCon, {
        parentName: duLieu.tenThuMuc,
      });
      await createTaiLieu(page, pw, duLieu.recordUrl, duLieu.tenTaiLieuCon, {
        folderName: duLieu.tenThuMuc,
      });
    }

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

  return duLieu;
};
