import { Page } from "@playwright/test";
import { test } from "../../src/fixture/base-test";
import { PW } from "../../src/utils/PW";
import {
  createBoHoSo,
  createThuMuc,
  chuyenHoatDong,
  FOLDER_PICKER,
} 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.1 — Tạo thư mục trong Cấu trúc hồ sơ**
 * (UC22).
 */

export type DungDuLieuOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"153-TT"` → `AT-UC22-153-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 cần test 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 sẵn 1 thư mục ở gốc BHS (mặc định **có**) — cần cho các case kiểm tra menu mở rộng
   * trên dòng thư mục.
   */
  taoThuMuc?: boolean;
  /**
   * Tạo thêm 1 thư mục **có quyền độc lập** và cấp quyền tại chính thư mục đó
   * (`permTestId` dùng hằng `FOLDER_PICKER`) → dựng tiền điều kiện
   * "người dùng chỉ có quyền Owner / Tạo mới **ở cấu trúc thư mục**".
   *
   * Kết quả: `duLieu.tenThuMucCoQuyen` = dòng vai **có** quyền,
   * `duLieu.tenThuMuc` = dòng vai **không** có quyền (chỉ kế thừa quyền của BHS).
   */
  taoThuMucCoQuyen?: {
    account: string;
    /** Dùng hằng `FOLDER_PICKER` (testId `pp-multi-usersRight*`) */
    permTestId: string;
    /** Đặt Độ mật của thư mục cha khác giá trị kế thừa: "Thường" | "Mật" | "Tuyệt mật" */
    doMat?: string;
    /** Đặt Trạng thái hiển thị của thư mục cha: "Public" | "Private" */
    trangThaiHienThi?: string;
  };
  /** Chuyển BHS sang "Hoạt động" — bắt buộc khi vai cần test không phải Owner 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 của BHS */
  tenThuMuc: string;
  /** Thư mục ở gốc BHS có **quyền độc lập** (chỉ có khi `taoThuMucCoQuyen`) */
  tenThuMucCoQuyen: 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
 *      └─ tenThuMucCoQuyen   ← quyền ĐỘC LẬP, cấp thêm quyền cho 1 vai   (khi taoThuMucCoQuyen)
 *
 * Vai cần test nhận quyền tại BHS (Owner / Tạo mới), nhờ kế thừa nên cũng có quyền đó ở
 * thư mục bên trong (`CLAUDE.md` — "quyền cấp lớn bao trùm cấp nhỏ"); còn `taoThuMucCoQuyen`
 * cấp quyền **chỉ tại 1 thư mục**, không có ở BHS.
 */
export const dungDuLieuBoHoSo = async (
  page: Page,
  opts: DungDuLieuOptions,
): Promise<DuLieu> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-UC22-${opts.maCase}-${ts}`;
  const duLieu: DuLieu = {
    recordUrl: "",
    tenThuMuc: `${goc}-TM`,
    tenThuMucCoQuyen: `${goc}-TM-CQ`,
  };

  const moTaQuyen = opts.quyenBanDau
    ? ` (cấp quyền cho "${opts.quyenBanDau.account}")`
    : "";
  const taoThuMuc = opts.taoThuMuc ?? true;
  const moTaThuMuc = taoThuMuc ? " + 1 thư mục ở gốc BHS" : "";
  const moTaThuMucCoQuyen = opts.taoThuMucCoQuyen
    ? ` + 1 thư mục có quyền độc lập cấp cho "${opts.taoThuMucCoQuyen.account}"`
    : "";

  await test.step(`Tiền điều kiện: tạo BHS${moTaQuyen}${moTaThuMuc}${moTaThuMucCoQuyen}`, 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,
    });

    if (taoThuMuc) {
      await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc);
    }

    if (opts.taoThuMucCoQuyen) {
      // Đặt quyền độc lập rồi THÊM quyền cho vai cần test (không xoá chip kế thừa) →
      // thư mục này là chỗ duy nhất vai đó có quyền Owner/Tạo mới.
      await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMucCoQuyen, {
        quyenDocLap: true,
        perm: {
          account: opts.taoThuMucCoQuyen.account,
          permTestId: opts.taoThuMucCoQuyen.permTestId,
        },
        doMat: opts.taoThuMucCoQuyen.doMat,
        trangThaiHienThi: opts.taoThuMucCoQuyen.trangThaiHienThi,
      });
    }

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

  return duLieu;
};

/* -------------------------------------------------------------------------- */
/* Dữ liệu riêng cho case 177 — 2 thư mục cha "mẫu" để test đổi cấp cha         */
/* -------------------------------------------------------------------------- */

/** Thông tin 1 thư mục cha "mẫu" dùng làm giá trị cụ thể để so sánh ở case 177 */
export type ThuMucChaMau177 = {
  /** Account được gán vào TẤT CẢ 5 trường quyền của thư mục cha (quyền ĐỘC LẬP) */
  account: string;
  doMat: string;
  trangThaiHienThi: string;
};

export type DuLieu177 = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS */
  recordUrl: string;
  /** Thư mục cha thứ 1 — Độ mật/Trạng thái/quyền theo `cha1` truyền vào */
  tenThuMuc1: string;
  /** Thư mục cha thứ 2 — Độ mật/Trạng thái/quyền theo `cha2` truyền vào */
  tenThuMuc2: string;
};

export type DungDuLieu177Options = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"177-TT"` → `AT-UC22-177-TT-<ts>` */
  maCase: string;
  cha1: ThuMucChaMau177;
  cha2: ThuMucChaMau177;
  /**
   * 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 (vd `ecm06` được cấp Owner ở BHS).
   */
  quyenBanDau?: { permTestId: string; account: string };
  /** Chuyển BHS sang "Hoạt động" — bắt buộc khi vai cần test không phải Owner BHS */
  chuyenSangHoatDong?: boolean;
};

/**
 * Dựng dữ liệu riêng cho case 177 (viết lại 2026-07-30 theo yêu cầu người dùng): 1 BHS mới +
 * 2 thư mục ở gốc BHS, mỗi thư mục có quyền **ĐỘC LẬP** và 1 account được gán vào **TẤT CẢ 5**
 * trường quyền (`FOLDER_PICKER`) — dùng làm 2 giá trị cụ thể, khác nhau hoàn toàn (Độ mật /
 * Trạng thái hiển thị / đối tượng phân quyền) để so sánh khi đổi trường "Thư mục/HS cấp cha"
 * của 1 thư mục thứ 3 (xem `1.4.1.steps.ts` → `moThuMuc3DatQuyenRiengRoiDoiCapCha`).
 *
 *     BHS  (Owner = `page` đang đăng nhập; thêm `quyenBanDau` nếu có)
 *      ├─ tenThuMuc1   ← quyền ĐỘC LẬP, `cha1.account` ở cả 5 trường quyền, Độ mật/Trạng thái theo `cha1`
 *      └─ tenThuMuc2   ← quyền ĐỘC LẬP, `cha2.account` ở cả 5 trường quyền, Độ mật/Trạng thái theo `cha2`
 */
export const dungDuLieu177 = async (
  page: Page,
  opts: DungDuLieu177Options,
): Promise<DuLieu177> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-UC22-${opts.maCase}-${ts}`;
  const duLieu: DuLieu177 = {
    recordUrl: "",
    tenThuMuc1: `${goc}-TM1`,
    tenThuMuc2: `${goc}-TM2`,
  };

  const moTaQuyen = opts.quyenBanDau
    ? ` (cấp quyền cho "${opts.quyenBanDau.account}")`
    : "";

  await test.step(`Tiền điều kiện: tạo BHS${moTaQuyen} + 2 thư mục cha mẫu ("${duLieu.tenThuMuc1}" cấp cho "${opts.cha1.account}", "${duLieu.tenThuMuc2}" cấp cho "${opts.cha2.account}")`, async () => {
    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.tenThuMuc1, {
      quyenDocLap: true,
      perm: {
        account: opts.cha1.account,
        permTestId: Object.values(FOLDER_PICKER),
      },
      doMat: opts.cha1.doMat,
      trangThaiHienThi: opts.cha1.trangThaiHienThi,
    });

    await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc2, {
      quyenDocLap: true,
      perm: {
        account: opts.cha2.account,
        permTestId: Object.values(FOLDER_PICKER),
      },
      doMat: opts.cha2.doMat,
      trangThaiHienThi: opts.cha2.trangThaiHienThi,
    });

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

  return duLieu;
};

/* -------------------------------------------------------------------------- */
/* Dữ liệu cho nhóm case kế thừa quyền (247, 248) — BHS phân đủ 5 quyền        */
/* -------------------------------------------------------------------------- */

export type DuLieu5Quyen = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS */
  recordUrl: string;
  /** Tên BHS */
  tenBoHoSo: string;
  /** Thư mục sẽ tạo ở gốc BHS (case tự tạo ở bước Thao tác, setup chỉ đặt tên) */
  tenThuMucCha: string;
  /** Thư mục con bên trong `tenThuMucCha` (case 248 không dùng) */
  tenThuMucCon: string;
};

export type DungDuLieu5QuyenOptions = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"247-TT"` → `AT-UC22-247-TT-<ts>` */
  maCase: string;
  /**
   * 5 quyền cấp ngay khi tạo BHS — `permTestId` dùng hằng `DOC_PERM` / `FOLDER_PICKER`
   * (`pp-multi-usersRight*`), mỗi quyền 1 đối tượng khác nhau (account **hoặc** tên nhóm).
   */
  quyen: readonly { permTestId: string; account: string }[];
};

/**
 * Dựng dữ liệu cho nhóm case kế thừa quyền (**247** — kế thừa từ cấp cha, **248** — ngắt kế thừa):
 * **chỉ tạo BHS** và cấp đủ 5 quyền cho 5 đối tượng khác nhau. Việc tạo thư mục là phần
 * **Thao tác** của case nên nằm trong `1.4.1.steps.ts`, không dựng sẵn ở đây.
 *
 *     BHS  (Owner = người gọi + đối tượng được cấp OWNER; 4 quyền còn lại mỗi quyền 1 đối tượng)
 *
 * ⚠️ Tên thư mục cha dùng hậu tố `-TM-CHA`, thư mục con `-TM-CON` — **không** đặt kiểu
 * `-TM` / `-TM-CON` vì các hàm tìm dòng theo tên (`getCauTrucRow`,
 * `getCodeCuaItemPhanQuyen`) khớp theo **chuỗi con**, tên cha là tiền tố của tên con sẽ khớp nhầm.
 */
export const dungDuLieuPhan5Quyen = async (
  page: Page,
  opts: DungDuLieu5QuyenOptions,
): Promise<DuLieu5Quyen> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-UC22-${opts.maCase}-${ts}`;
  const duLieu: DuLieu5Quyen = {
    recordUrl: "",
    tenBoHoSo: goc,
    tenThuMucCha: `${goc}-TM-CHA`,
    tenThuMucCon: `${goc}-TM-CON`,
  };

  const moTa = opts.quyen.map((q) => `${q.permTestId}=${q.account}`).join(", ");

  await test.step(`Tiền điều kiện: tạo BHS "${goc}" + phân 5 quyền (${moTa})`, async () => {
    duLieu.recordUrl = await createBoHoSo(page, pw, goc, {
      peoplePickers: opts.quyen.map((q) => ({
        testId: q.permTestId,
        account: q.account,
      })),
    });
  });

  return duLieu;
};

/* -------------------------------------------------------------------------- */
/* Dữ liệu riêng cho case 178 — 2 thư mục "mẫu" để test tìm kiếm cấp cha        */
/* -------------------------------------------------------------------------- */

export type DuLieu178 = {
  /** URL `?itemId=` của BHS — luôn dùng biến này để mở lại BHS */
  recordUrl: string;
  /** Thư mục 1 ở gốc BHS — dùng làm từ khoá tìm kiếm thứ nhất */
  tenThuMuc1: string;
  /** Thư mục 2 ở gốc BHS — dùng làm từ khoá tìm kiếm thứ hai */
  tenThuMuc2: string;
};

export type DungDuLieu178Options = {
  /** Mã ngắn để đặt tên dữ liệu, vd `"178-TT"` → `AT-UC22-178-TT-<ts>` */
  maCase: string;
};

/**
 * Dựng dữ liệu riêng cho case 178: 1 BHS mới + 2 thư mục **thường** (kế thừa quyền, không cần
 * quyền độc lập) ở gốc BHS — đủ để mở modal "Thêm thư mục" cho thư mục thứ 3 rồi tìm kiếm theo
 * tên lần lượt với 2 thư mục này trong ô "Thư mục/HS cấp cha".
 *
 *     BHS  (Owner = `page` đang đăng nhập)
 *      ├─ tenThuMuc1
 *      └─ tenThuMuc2
 */
export const dungDuLieu178 = async (
  page: Page,
  opts: DungDuLieu178Options,
): Promise<DuLieu178> => {
  const pw = new PW(page);
  const ts = Date.now();
  const goc = `AT-UC22-${opts.maCase}-${ts}`;
  const duLieu: DuLieu178 = {
    recordUrl: "",
    tenThuMuc1: `${goc}-TM1`,
    tenThuMuc2: `${goc}-TM2`,
  };

  await test.step(`Tiền điều kiện: tạo BHS + 2 thư mục ("${duLieu.tenThuMuc1}", "${duLieu.tenThuMuc2}") ở gốc BHS`, async () => {
    duLieu.recordUrl = await createBoHoSo(page, pw, goc);
    await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc1);
    await createThuMuc(page, pw, duLieu.recordUrl, duLieu.tenThuMuc2);
  });

  return duLieu;
};
