import { test, expect, Page } from '@playwright/test';
import { strictEqual } from 'assert';
import { watchFile } from 'fs';
import { waitForDebugger } from 'inspector';

let page: Page;

test.beforeAll(async ({ browser }) => {
  page = await browser.newPage();
});

test.afterAll(async () => {
  if (page !== undefined) {
    await page.close();
  }
});

test('Login', async () => {
  // Login
  await page.goto('http://192.168.1.90:20001/');
  await expect(page).toHaveTitle(/^Sign in to /);
  await page.fill("input[name='username']", 'admin');
  await page.fill("input[name='password']", '1234');
  await page.click('id=kc-login');
  await page.waitForTimeout(2000);
  //   await page.click('id=acceptBtn');
});

test('ตรวจสอบการแสดงผลฟิลด์แสดงผลลำดับที่', async () => {
  try {
    // คลิกเมนูเพื่อจัดการสาขา
    await page.click('id=menu-icon-branch-management');

    // คลิกเพื่อเปิด dropdown
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด

    // คลิกเพื่อปิดคอลัมน์ที่ 1
    await page.click('id=select-field_0');
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์ถูกซ่อน
    const column1 = page.locator('id=select-field_0');
    const column1Cells = page.locator(
      "//th[normalize-space(text())='ลำดับที่']",
    );

    const isColumn1Hidden = await column1.evaluate(
      (el) => window.getComputedStyle(el).display === 'none',
    );
    console.log('คอลัมน์ที่ 1 ซ่อนอยู่:', isColumn1Hidden); // เช็ค

    const areCellsHidden = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display === 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 1 ซ่อนอยู่:', areCellsHidden); // เช็ค

    expect(isColumn1Hidden).toBe(false);
    expect(areCellsHidden).toBe(true);

    // คลิกอีกครั้งเพื่อเปิดคอลัมน์ที่ 1
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด
    await page.click('id=select-field_0'); // คลิกเพื่อเปิดคอลัมน์
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์แสดงอยู่
    const isColumn1Visible = await column1.evaluate(
      (el) => window.getComputedStyle(el).display !== 'none',
    );
    console.log('คอลัมน์ที่ 1 แสดงอยู่:', isColumn1Visible); // เช็ค

    const areCellsVisible = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display !== 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 1 แสดงอยู่:', areCellsVisible); // เช็ค

    expect(isColumn1Visible).toBe(true);
    expect(areCellsVisible).toBe(true);

    console.log('ตรวจสอบการเปิด/ซ่อนคอลัมน์ในตารางสำเร็จ');
  } catch (error) {
    console.error('เกิดข้อผิดพลาดในการทดสอบ:', error);
    throw error;
  }

  await page.waitForTimeout(2000);
});

test('ตรวจสอบการแสดงผลฟิลด์แสดงผลชื่อ', async () => {
  try {
    // คลิกเพื่อเปิด dropdown
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด

    // คลิกเพื่อปิดคอลัมน์ที่ 2
    await page.click('id=select-field_1');
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์ถูกซ่อน
    const column1 = page.locator('id=select-field_1');
    const column1Cells = page.locator(
      "//th[normalize-space(text())='สำนักงาน']",
    );

    const isColumn1Hidden = await column1.evaluate(
      (el) => window.getComputedStyle(el).display === 'none',
    );
    console.log('คอลัมน์ที่ 2 ซ่อนอยู่:', isColumn1Hidden); // เช็ค

    const areCellsHidden = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display === 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 2 ซ่อนอยู่:', areCellsHidden); // เช็ค

    expect(isColumn1Hidden).toBe(false);
    expect(areCellsHidden).toBe(true);

    // คลิกอีกครั้งเพื่อเปิดคอลัมน์ที่ 2
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด
    await page.click('id=select-field_1'); // คลิกเพื่อเปิดคอลัมน์
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์แสดงอยู่
    const isColumn1Visible = await column1.evaluate(
      (el) => window.getComputedStyle(el).display !== 'none',
    );
    console.log('คอลัมน์ที่ 2 แสดงอยู่:', isColumn1Visible); // เช็ค

    const areCellsVisible = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display !== 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 2 แสดงอยู่:', areCellsVisible); // เช็ค

    expect(isColumn1Visible).toBe(true);
    expect(areCellsVisible).toBe(true);

    console.log('ตรวจสอบการเปิด/ซ่อนคอลัมน์ในตารางสำเร็จ');
  } catch (error) {
    console.error('เกิดข้อผิดพลาดในการทดสอบ:', error);
    throw error;
  }

  await page.waitForTimeout(2000);
});

test('ตรวจสอบการแสดงผลฟิลด์แสดงผลทะเบียนนิติบุคคล', async () => {
  try {
    // คลิกเพื่อเปิด dropdown
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด

    // คลิกเพื่อปิดคอลัมน์ที่ 3
    await page.click('id=select-field_2');
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์ถูกซ่อน
    const column1 = page.locator('id=select-field_2');
    const column1Cells = page.locator(
      "//th[normalize-space(text())='ทะเบียนนิติบุคคล']",
    );

    const isColumn1Hidden = await column1.evaluate(
      (el) => window.getComputedStyle(el).display === 'none',
    );
    console.log('คอลัมน์ที่ 3 ซ่อนอยู่:', isColumn1Hidden); // เช็ค

    const areCellsHidden = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display === 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 3 ซ่อนอยู่:', areCellsHidden); // เช็ค

    expect(isColumn1Hidden).toBe(false);
    expect(areCellsHidden).toBe(true);

    // คลิกอีกครั้งเพื่อเปิดคอลัมน์ที่ 3
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด
    await page.click('id=select-field_2'); // คลิกเพื่อเปิดคอลัมน์
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์แสดงอยู่
    const isColumn1Visible = await column1.evaluate(
      (el) => window.getComputedStyle(el).display !== 'none',
    );
    console.log('คอลัมน์ที่ 3 แสดงอยู่:', isColumn1Visible); // เช็ค

    const areCellsVisible = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display !== 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 3 แสดงอยู่:', areCellsVisible); // เช็ค

    expect(isColumn1Visible).toBe(true);
    expect(areCellsVisible).toBe(true);

    console.log('ตรวจสอบการเปิด/ซ่อนคอลัมน์ในตารางสำเร็จ');
  } catch (error) {
    console.error('เกิดข้อผิดพลาดในการทดสอบ:', error);
    throw error;
  }

  await page.waitForTimeout(2000);
});

test('ตรวจสอบการแสดงผลฟิลด์แสดงผลเบอร์โทรสำนักงาน', async () => {
  try {
    // คลิกเพื่อเปิด dropdown
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด

    // คลิกเพื่อปิดคอลัมน์ที่ 4
    await page.click('id=select-field_3');
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์ถูกซ่อน
    const column1 = page.locator('id=select-field_3');
    const column1Cells = page.locator(
      "//th[normalize-space(text())='เบอร์โทรสำนักงาน']",
    );

    const isColumn1Hidden = await column1.evaluate(
      (el) => window.getComputedStyle(el).display === 'none',
    );
    console.log('คอลัมน์ที่ 4 ซ่อนอยู่:', isColumn1Hidden); // เช็ค

    const areCellsHidden = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display === 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 4 ซ่อนอยู่:', areCellsHidden); // เช็ค

    expect(isColumn1Hidden).toBe(false);
    expect(areCellsHidden).toBe(true);

    // คลิกอีกครั้งเพื่อเปิดคอลัมน์ที่ 4
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด
    await page.click('id=select-field_3'); // คลิกเพื่อเปิดคอลัมน์
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์แสดงอยู่
    const isColumn1Visible = await column1.evaluate(
      (el) => window.getComputedStyle(el).display !== 'none',
    );
    console.log('คอลัมน์ที่ 4 แสดงอยู่:', isColumn1Visible); // เช็ค

    const areCellsVisible = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display !== 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 4 แสดงอยู่:', areCellsVisible); // เช็ค

    expect(isColumn1Visible).toBe(true);
    expect(areCellsVisible).toBe(true);

    console.log('ตรวจสอบการเปิด/ซ่อนคอลัมน์ในตารางสำเร็จ');
  } catch (error) {
    console.error('เกิดข้อผิดพลาดในการทดสอบ:', error);
    throw error;
  }

  await page.waitForTimeout(2000);
});

test('ตรวจสอบการแสดงผลฟิลด์แสดงผลติดต่อ', async () => {
  try {
    // คลิกเพื่อเปิด dropdown
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด

    // คลิกเพื่อปิดคอลัมน์ที่ 5
    await page.click('id=select-field_4');
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์ถูกซ่อน
    const column1 = page.locator('id=select-field_4');
    const column1Cells = page.locator("//th[normalize-space(text())='ติดต่อ']");

    const isColumn1Hidden = await column1.evaluate(
      (el) => window.getComputedStyle(el).display === 'none',
    );
    console.log('คอลัมน์ที่ 5 ซ่อนอยู่:', isColumn1Hidden); // เช็ค

    const areCellsHidden = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display === 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 5 ซ่อนอยู่:', areCellsHidden); // เช็ค

    expect(isColumn1Hidden).toBe(false);
    expect(areCellsHidden).toBe(true);

    // คลิกอีกครั้งเพื่อเปิดคอลัมน์ที่ 5
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด
    await page.click('id=select-field_4'); // คลิกเพื่อเปิดคอลัมน์
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์แสดงอยู่
    const isColumn1Visible = await column1.evaluate(
      (el) => window.getComputedStyle(el).display !== 'none',
    );
    console.log('คอลัมน์ที่ 5 แสดงอยู่:', isColumn1Visible); // เช็ค

    const areCellsVisible = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display !== 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 5 แสดงอยู่:', areCellsVisible); // เช็ค

    expect(isColumn1Visible).toBe(true);
    expect(areCellsVisible).toBe(true);

    console.log('ตรวจสอบการเปิด/ซ่อนคอลัมน์ในตารางสำเร็จ');
  } catch (error) {
    console.error('เกิดข้อผิดพลาดในการทดสอบ:', error);
    throw error;
  }

  await page.waitForTimeout(2000);
});

test('ตรวจสอบการแสดงผลฟิลด์แสดงผลที่อยู่', async () => {
  try {
    // คลิกเพื่อเปิด dropdown
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด

    // คลิกเพื่อปิดคอลัมน์ที่ 6
    await page.click('id=select-field_5');
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์ถูกซ่อน
    const column1 = page.locator('id=select-field_5');
    const column1Cells = page.locator(
      "//th[normalize-space(text())='ที่อยู่']",
    );

    const isColumn1Hidden = await column1.evaluate(
      (el) => window.getComputedStyle(el).display === 'none',
    );
    console.log('คอลัมน์ที่ 6 ซ่อนอยู่:', isColumn1Hidden); // เช็ค

    const areCellsHidden = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display === 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 6 ซ่อนอยู่:', areCellsHidden); // เช็ค

    expect(isColumn1Hidden).toBe(false);
    expect(areCellsHidden).toBe(true);

    // คลิกอีกครั้งเพื่อเปิดคอลัมน์ที่ 6
    await page.keyboard.press('Escape');
    await page.click("(//input[@id='select-field'])[1]");
    await page.waitForTimeout(1000); // รอให้ dropdown เปิด
    await page.click('id=select-field_5'); // คลิกเพื่อเปิดคอลัมน์
    await page.waitForTimeout(1000); // รอให้ UI อัปเดต

    // ตรวจสอบว่าคอลัมน์แสดงอยู่
    const isColumn1Visible = await column1.evaluate(
      (el) => window.getComputedStyle(el).display !== 'none',
    );
    console.log('คอลัมน์ที่ 6 แสดงอยู่:', isColumn1Visible); // เช็ค

    const areCellsVisible = await column1Cells.evaluateAll((cells) =>
      cells.every((cell) => window.getComputedStyle(cell).display !== 'none'),
    );
    console.log('เซลล์ในคอลัมน์ที่ 6 แสดงอยู่:', areCellsVisible); // เช็ค

    expect(isColumn1Visible).toBe(true);
    expect(areCellsVisible).toBe(true);

    console.log('ตรวจสอบการเปิด/ซ่อนคอลัมน์ในตารางสำเร็จ');
  } catch (error) {
    console.error('เกิดข้อผิดพลาดในการทดสอบ:', error);
    throw error;
  }

  await page.waitForTimeout(2000);
});
