const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');

async function runTests() {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  
  const results = [];
  const screenshotDir = path.join(__dirname, 'test_screenshots');
  
  if (!fs.existsSync(screenshotDir)) {
    fs.mkdirSync(screenshotDir, { recursive: true });
  }
  
  try {
    console.log('='.repeat(60));
    console.log('MES 시스템 - 기준정보 메뉴 테스트');
    console.log('='.repeat(60) + '\n');
    
    // 1. 페이지 로드
    console.log('[1단계] 페이지 로드 및 초기 상태 확인');
    console.log('-'.repeat(60));
    await page.goto('http://localhost:3000', { waitUntil: 'networkidle' });
    await page.waitForTimeout(1500);
    await page.screenshot({ path: path.join(screenshotDir, '01_initial_page.png') });
    console.log('페이지 로드 완료');
    console.log('URL: ' + page.url());
    console.log('  스크린샷: 01_initial_page.png');
    results.push('페이지 로드 완료 (이미 로그인 상태)');
    console.log();
    
    // 2. 기준정보 메뉴 영역 확인
    console.log('[2단계] 기준정보 메뉴 상태 확인');
    console.log('-'.repeat(60));
    
    const basicInfoButton = page.locator('button').filter({ hasText: /^기준정보$/ });
    const buttonCount = await basicInfoButton.count();
    console.log('기준정보 버튼 개수: ' + buttonCount);
    
    if (buttonCount > 0) {
      console.log('기준정보 메뉴가 표시되고 있음');
      await page.screenshot({ path: path.join(screenshotDir, '02_menu_visible.png') });
      results.push('기준정보 메뉴 표시 확인됨');
    }
    console.log();
    
    // 3. 5개 서브메뉴 확인
    console.log('[3단계] 5개 서브메뉴 존재 여부 확인');
    console.log('-'.repeat(60));
    
    const expectedMenus = [
      '품목기준관리',
      '공정기준관리',
      '검사기준관리',
      '거래처기준관리',
      '현장기준관리'
    ];
    
    let foundCount = 0;
    for (const menuName of expectedMenus) {
      const menu = page.locator('button').filter({ hasText: new RegExp('^' + menuName + '$') });
      const count = await menu.count();
      
      if (count > 0) {
        console.log('  [O] ' + menuName);
        results.push(menuName + ' - 존재');
        foundCount++;
      } else {
        console.log('  [X] ' + menuName + ' - 없음');
        results.push(menuName + ' - 없음');
      }
    }
    console.log('\n총 ' + foundCount + '개 / 5개 메뉴 발견');
    console.log();
    
    // 4. 각 메뉴 클릭 및 탭 확인
    console.log('[4단계] 각 메뉴 클릭 및 탭 구조 확인');
    console.log('-'.repeat(60));
    
    for (let idx = 0; idx < expectedMenus.length; idx++) {
      const menuName = expectedMenus[idx];
      
      try {
        const menu = page.locator('button').filter({ hasText: new RegExp('^' + menuName + '$') });
        const count = await menu.count();
        
        if (count > 0) {
          console.log('\n[' + (idx+1) + '] ' + menuName);
          
          // 메뉴 클릭
          await menu.first().click();
          console.log('  - 클릭 완료');
          
          // 페이지 로드 대기
          await page.waitForTimeout(1200);
          
          // 탭 찾기
          let tabs = await page.locator('.ant-tabs-tab').all();
          if (tabs.length === 0) {
            tabs = await page.locator('[class*="Tab"]:visible').all();
          }
          if (tabs.length === 0) {
            tabs = await page.locator('div[role="tab"]').all();
          }
          
          const tabCount = tabs.length;
          console.log('  - 발견된 탭: ' + tabCount + '개');
          
          // 탭 내용 출력
          if (tabCount > 0) {
            for (let i = 0; i < Math.min(tabCount, 8); i++) {
              const tabText = await tabs[i].textContent();
              const trimmed = tabText ? tabText.trim() : '';
              if (trimmed.length > 0) {
                console.log('    ' + (i+1) + '. ' + trimmed.substring(0, 20));
              }
            }
          }
          
          if (tabCount === 6) {
            console.log('  - 결과: OK (6개 탭)');
            results.push(menuName + ' - 6개 탭 확인됨');
          } else {
            console.log('  - 결과: ' + tabCount + '개 탭 (예상: 6개)');
            results.push(menuName + ' - ' + tabCount + '개 탭');
          }
          
          // 스크린샷 저장
          const sanitized = menuName.replace(/[^가-힣a-zA-Z0-9]/g, '_');
          await page.screenshot({ 
            path: path.join(screenshotDir, '03_' + sanitized + '.png') 
          });
          console.log('  - 스크린샷: 03_' + sanitized + '.png');
          
        }
      } catch (e) {
        console.log('  오류: ' + e.message);
        results.push(menuName + ' - 오류: ' + e.message);
      }
    }
    
    console.log();
    
    // 최종 스크린샷
    await page.screenshot({ path: path.join(screenshotDir, '04_final_state.png') });
    
  } catch (error) {
    console.error('테스트 오류: ' + error.message);
    results.push('테스트 오류: ' + error.message);
  } finally {
    // 결과 파일 저장
    const resultFile = path.join(__dirname, 'test_result_report.txt');
    const now = new Date();
    const timeStr = now.toLocaleString('ko-KR');
    
    const report = 'MES 시스템 - 기준정보 메뉴 테스트 보고서\n' +
      '='.repeat(60) + '\n' +
      '테스트 실행 시간: ' + timeStr + '\n' +
      '시스템 URL: http://localhost:3000\n' +
      'API 타입: Playwright\n\n' +
      '테스트 항목:\n' +
      '1. 페이지 로드 및 로그인 상태 확인\n' +
      '2. 기준정보 메뉴 표시 확인\n' +
      '3. 5개 서브메뉴 존재 확인 (품목/공정/검사/거래처/현장 기준관리)\n' +
      '4. 각 메뉴 클릭 시 6개 탭 표시 확인\n\n' +
      '상세 결과:\n' +
      results.map((r, i) => (i+1) + '. ' + r).join('\n') + '\n\n' +
      '스크린샷 저장 위치:\n' +
      screenshotDir + '\n\n' +
      '스크린샷 파일 목록:\n' +
      '- 01_initial_page.png: 초기 페이지 로드\n' +
      '- 02_menu_visible.png: 기준정보 메뉴 상태\n' +
      '- 03_품목기준관리.png\n' +
      '- 03_공정기준관리.png\n' +
      '- 03_검사기준관리.png\n' +
      '- 03_거래처기준관리.png\n' +
      '- 03_현장기준관리.png\n' +
      '- 04_final_state.png: 최종 상태\n' +
      '='.repeat(60);
    
    fs.writeFileSync(resultFile, report, 'utf-8');
    
    console.log('='.repeat(60));
    console.log('테스트 완료');
    console.log('='.repeat(60) + '\n');
    
    console.log('최종 결과:');
    results.forEach((r, i) => console.log((i+1) + '. ' + r));
    
    console.log('\n스크린샷 저장 위치:');
    console.log(screenshotDir);
    console.log('\n테스트 보고서:');
    console.log(resultFile);
    
    await browser.close();
  }
}

runTests().catch(console.error);
