#!/usr/bin/env python3
"""Playwright를 사용한 약재 정보 페이지 UI 테스트"""

import asyncio
from playwright.async_api import async_playwright
import time

async def test_herb_info_page():
    async with async_playwright() as p:
        # 브라우저 시작
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()

        # 콘솔 메시지 캡처
        console_messages = []
        page.on("console", lambda msg: console_messages.append(f"{msg.type}: {msg.text}"))

        # 페이지 에러 캡처
        page_errors = []
        page.on("pageerror", lambda err: page_errors.append(str(err)))

        try:
            print("=== Playwright 약재 정보 페이지 테스트 ===\n")

            # 1. 메인 페이지 접속
            print("1. 메인 페이지 접속...")
            await page.goto("http://localhost:5001")
            await page.wait_for_load_state("networkidle")

            # 2. 약재 정보 메뉴 클릭
            print("2. 약재 정보 메뉴 클릭...")
            herb_info_link = page.locator('a[data-page="herb-info"]')
            is_visible = await herb_info_link.is_visible()
            print(f"   - 약재 정보 메뉴 표시 여부: {is_visible}")

            if is_visible:
                await herb_info_link.click()
                await page.wait_for_timeout(2000)  # 2초 대기

                # 3. herb-info 페이지 표시 확인
                print("\n3. 약재 정보 페이지 요소 확인...")
                herb_info_div = page.locator('#herb-info')
                is_herb_info_visible = await herb_info_div.is_visible()
                print(f"   - herb-info div 표시: {is_herb_info_visible}")

                if is_herb_info_visible:
                    # 검색 섹션 확인
                    search_section = page.locator('#herb-search-section')
                    is_search_visible = await search_section.is_visible()
                    print(f"   - 검색 섹션 표시: {is_search_visible}")

                    # 약재 카드 그리드 확인
                    herb_grid = page.locator('#herbInfoGrid')
                    is_grid_visible = await herb_grid.is_visible()
                    print(f"   - 약재 그리드 표시: {is_grid_visible}")

                    # 약재 카드 개수 확인
                    await page.wait_for_selector('.herb-info-card', timeout=5000)
                    herb_cards = await page.locator('.herb-info-card').count()
                    print(f"   - 표시된 약재 카드 수: {herb_cards}개")

                    if herb_cards > 0:
                        # 첫 번째 약재 카드 정보 확인
                        first_card = page.locator('.herb-info-card').first
                        card_title = await first_card.locator('.card-title').text_content()
                        print(f"   - 첫 번째 약재: {card_title}")

                        # 카드 클릭으로 상세 보기 (카드 전체가 클릭 가능)
                        print("\n4. 약재 상세 정보 확인...")
                        # herb-info-card는 클릭 가능한 카드이므로 직접 클릭
                        if True:
                            await first_card.click()
                            await page.wait_for_timeout(1000)

                            # 상세 모달 확인
                            modal = page.locator('#herbDetailModal')
                            is_modal_visible = await modal.is_visible()
                            print(f"   - 상세 모달 표시: {is_modal_visible}")

                            if is_modal_visible:
                                modal_title = await modal.locator('.modal-title').text_content()
                                print(f"   - 모달 제목: {modal_title}")

                                # 모달 닫기
                                close_btn = modal.locator('button.btn-close')
                                if await close_btn.is_visible():
                                    await close_btn.click()
                                    await page.wait_for_timeout(500)

                    # 5. 검색 기능 테스트
                    print("\n5. 검색 기능 테스트...")
                    search_input = page.locator('#herbSearchInput')
                    if await search_input.is_visible():
                        await search_input.fill("감초")
                        await page.locator('#herbSearchBtn').click()
                        await page.wait_for_timeout(1000)

                        search_result_count = await page.locator('.herb-info-card').count()
                        print(f"   - '감초' 검색 결과: {search_result_count}개")

                    # 6. 효능별 보기 테스트
                    print("\n6. 효능별 보기 전환...")
                    efficacy_btn = page.locator('button[data-view="efficacy"]')
                    if await efficacy_btn.is_visible():
                        await efficacy_btn.click()
                        await page.wait_for_timeout(1000)

                        efficacy_section = page.locator('#herb-efficacy-section')
                        is_efficacy_visible = await efficacy_section.is_visible()
                        print(f"   - 효능별 섹션 표시: {is_efficacy_visible}")

                        if is_efficacy_visible:
                            tag_buttons = await page.locator('.efficacy-tag-btn').count()
                            print(f"   - 효능 태그 버튼 수: {tag_buttons}개")
                else:
                    print("   ⚠️ herb-info div가 표시되지 않음!")

                    # 디버깅: 현재 활성 페이지 확인
                    active_pages = await page.locator('.main-content.active').count()
                    print(f"   - 활성 페이지 수: {active_pages}")

                    # 디버깅: herb-info의 display 스타일 확인
                    herb_info_style = await herb_info_div.get_attribute('style')
                    print(f"   - herb-info style: {herb_info_style}")

                    # 디버깅: herb-info의 클래스 확인
                    herb_info_classes = await herb_info_div.get_attribute('class')
                    print(f"   - herb-info classes: {herb_info_classes}")

            # 7. 콘솔 에러 확인
            print("\n7. 콘솔 메시지 확인...")
            if console_messages:
                print("   콘솔 메시지:")
                for msg in console_messages[:10]:  # 처음 10개만 출력
                    print(f"     - {msg}")
            else:
                print("   ✓ 콘솔 메시지 없음")

            if page_errors:
                print("   ⚠️ 페이지 에러:")
                for err in page_errors:
                    print(f"     - {err}")
            else:
                print("   ✓ 페이지 에러 없음")

            # 스크린샷 저장
            await page.screenshot(path="/root/kdrug/herb_info_page.png")
            print("\n스크린샷 저장: /root/kdrug/herb_info_page.png")

        except Exception as e:
            print(f"\n❌ 테스트 실패: {e}")
            # 에러 시 스크린샷
            await page.screenshot(path="/root/kdrug/herb_info_error.png")
            print("에러 스크린샷 저장: /root/kdrug/herb_info_error.png")

        finally:
            await browser.close()

if __name__ == "__main__":
    print("Playwright 테스트 시작...\n")
    asyncio.run(test_herb_info_page())
    print("\n테스트 완료!")