import { Page } from "@playwright/test";
import { test, expect, ACCOUNT } from "../../../src/fixture/base-test";
import { TIMEOUT } from "../../../src/constant/timeout";
import { PW } from "../../../src/utils/PW";

const BASE_URL = process.env.BASE_URL!;

const runTest = async (page: Page) => {
  const pw = new PW(page);
  const errors: string[] = [];

  await test.step("1. Truy cập màn hình Kho tài liệu", async () => {
    await page.goto(`${BASE_URL}/hoso-quan-ly`);
  });
  await test.step("2. Chọn nút Tạo mới", async () => {
    await pw.isVisible("btn-create-hstl", TIMEOUT.PAGE_LOADING);
    await pw.clickButton("btn-create-hstl");
  });

  // ── Tìm kiếm option ──

  // TC 1.1.2.11: [Thư mục lưu trữ] Tìm kiếm option
  await test.step("1.1.2.11 - [Thư mục lưu trữ] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchTreeDropdownHasOption(
        "tree-sel-mucLuuTru",
        "Hồ sơ Phòng ban",
      );
    } catch (e) {
      errors.push(`[1.1.2.11] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.16: [Công ty. Tổ chức] Tìm kiếm option
  await test.step("1.1.2.16 - [Công ty. Tổ chức] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchDropdownHasOption(
        "sel-companyInvestor",
        "Công ty TNHH Mặt Trời Phú Quốc",
      );
    } catch (e) {
      errors.push(`[1.1.2.16] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.19: [Đơn vị sở hữu] Tìm kiếm option
  await test.step("1.1.2.19 - [Đơn vị sở hữu] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchTreeDropdownHasOption(
        "tree-sel-owner-department",
        "Hồ sơ Phòng ban",
      );
    } catch (e) {
      errors.push(`[1.1.2.19] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.24: [Loại Hồ sơ] Tìm kiếm option
  await test.step("1.1.2.24 - [Loại Hồ sơ] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchDropdownHasOption(
        "sel-loaiBoHoSo",
        "Hồ sơ phòng ban",
      );
    } catch (e) {
      errors.push(`[1.1.2.24] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.33: [Độ mật] Tìm kiếm option
  await test.step("1.1.2.33 - [Độ mật] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchDropdownHasOption("sel-securityLevel", "Tuyệt mật");
    } catch (e) {
      errors.push(`[1.1.2.33] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.41: [Cấu trúc HS] Tìm kiếm option
  await test.step("1.1.2.41 - [Cấu trúc HS] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchDropdownHasOption(
        "sel-cauTrucHoSo",
        "Cấu trúc hồ sơ bất động sản vFinal",
      );
    } catch (e) {
      errors.push(`[1.1.2.41] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.47: [Trạng thái hiển thị] Tìm kiếm option
  await test.step("1.1.2.47 - [Trạng thái hiển thị] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchDropdownHasOption("sel-trangThai", "Private");
    } catch (e) {
      errors.push(`[1.1.2.47] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.50: [Thời hạn lưu trữ] Tìm kiếm option
  await test.step("1.1.2.50 - [Thời hạn lưu trữ] Tìm kiếm option", async () => {
    try {
      await pw.checkSearchDropdownHasOption("sel-storageTerm", "20 năm");
    } catch (e) {
      errors.push(`[1.1.2.50] ${(e as Error).message}`);
    }
  });

  // ── Danh sách options ──

  // TC 1.1.2.34: [Độ mật] Danh sách options theo điều kiện
  await test.step("1.1.2.34 - [Độ mật] Danh sách options", async () => {
    try {
      await pw.checkListValueDropdownList("sel-securityLevel", [
        "Thường",
        "Mật",
        "Tuyệt mật",
      ]);
    } catch (e) {
      errors.push(`[1.1.2.34] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.48: [Trạng thái hiển thị] Danh sách options theo điều kiện
  await test.step("1.1.2.48 - [Trạng thái hiển thị] Danh sách options", async () => {
    try {
      await pw.checkListValueDropdownList("sel-trangThai", [
        "Public",
        "Private",
      ]);
    } catch (e) {
      errors.push(`[1.1.2.48] ${(e as Error).message}`);
    }
  });

  // TC 1.1.2.51: [Thời hạn lưu trữ] Danh sách options theo điều kiện
  await test.step("1.1.2.51 - [Thời hạn lưu trữ] Danh sách options", async () => {
    try {
      await pw.checkListValueDropdownList("sel-storageTerm", [
        "Vĩnh viễn",
        "5 năm",
        "10 năm",
        "20 năm",
      ]);
    } catch (e) {
      errors.push(`[1.1.2.51] ${(e as Error).message}`);
    }
  });

  if (errors.length > 0) {
    throw new Error(`Các test case thất bại:\n${errors.join("\n")}`);
  }
};

test(
  "UC19 1.1.2 - Tổng hợp tìm kiếm option và danh sách options - Thủ thư " +
    ACCOUNT.LIBRARIAN,
  async ({ librarian }) => {
    await runTest(librarian);
  },
);
