#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
E2E 테스트: 조제 화면에서 쌍화탕 선택 후 인삼 선택 가능 확인
"""

from playwright.sync_api import sync_playwright, expect
import time

def test_compound_ginseng_selection():
    """쌍화탕 조제 시 인삼 선택 가능 테스트"""

    with sync_playwright() as p:
        # 브라우저 실행 (headless 모드)
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()

        try:
            print("=" * 80)
            print("E2E 테스트: 쌍화탕 조제 시 인삼 선택 가능 확인")
            print("=" * 80)

            # 1. 메인 페이지 접속
            print("\n[1] 메인 페이지 접속...")
            page.goto('http://localhost:5001')
            page.wait_for_load_state('networkidle')
            print("✓ 페이지 로드 완료")

            # 2. 조제관리 메뉴 클릭
            print("\n[2] 조제관리 메뉴 클릭...")

            # 사이드바에서 조제 관리 클릭
            compound_menu = page.locator('text=조제 관리').first
            compound_menu.click()
            time.sleep(2)
            print("✓ 조제관리 화면 진입")

            # 조제 입력 섹션 표시
            print("\n[2-1] 조제 입력 섹션 표시...")
            show_compound_entry = page.locator('#showCompoundEntry')
            if show_compound_entry.count() > 0:
                show_compound_entry.click()
                time.sleep(1)
                print("✓ 조제 입력 섹션 표시")

            # 3. 현재 화면 상태 확인
            print("\n[3] 화면 상태 확인...")

            # 스크린샷 저장
            page.screenshot(path='/tmp/compound_screen_after_menu_click.png')
            print("✓ 스크린샷: /tmp/compound_screen_after_menu_click.png")

            # 페이지에 select 요소가 있는지 확인
            all_selects = page.locator('select').all()
            print(f"✓ 페이지 내 select 요소: {len(all_selects)}개")

            for idx, sel in enumerate(all_selects):
                sel_id = sel.get_attribute('id')
                sel_name = sel.get_attribute('name')
                print(f"  [{idx}] id={sel_id}, name={sel_name}")

            # 처방 선택 시도
            print("\n[4] 처방 선택...")

            # compoundFormula select 요소 찾기 (ID로 정확히)
            formula_select = page.locator('#compoundFormula')

            if formula_select.count() > 0:
                # select가 visible 될 때까지 기다리기
                try:
                    formula_select.wait_for(state="visible", timeout=5000)
                except:
                    print("⚠️  처방 선택 드롭다운이 보이지 않음")

                # 옵션 확인
                options = formula_select.locator('option').all()
                print(f"✓ 드롭다운 옵션: {len(options)}개")
                for opt in options:
                    print(f"  - {opt.text_content()}")

                # 쌍화탕 선택
                try:
                    formula_select.select_option(label='쌍화탕')
                    time.sleep(3)
                    print("✓ 쌍화탕 선택 완료")
                except Exception as e:
                    print(f"⚠️  label로 선택 실패: {e}")
                    # index로 시도 (첫 번째 옵션은 보통 placeholder이므로 index=1)
                    try:
                        formula_select.select_option(index=1)
                        time.sleep(3)
                        print("✓ 첫 번째 처방 선택 완료")
                    except Exception as e2:
                        print(f"❌ 처방 선택 실패: {e2}")
            else:
                print("❌ 처방 드롭다운을 찾을 수 없음")

            # 5. 약재 추가 버튼 클릭
            print("\n[5] 약재 추가 버튼 클릭...")

            # 약재 추가 버튼 찾기
            add_ingredient_btn = page.locator('#addIngredientBtn')

            if add_ingredient_btn.count() > 0:
                add_ingredient_btn.click()
                time.sleep(1)
                print("✓ 약재 추가 버튼 클릭 완료")

                # 6. 새로 추가된 행에서 약재 선택 드롭다운 확인
                print("\n[6] 약재 선택 드롭다운 확인...")

                # 새로 추가된 행 찾기 (마지막 행)
                new_row = page.locator('#compoundIngredients tr').last

                # 약재 선택 드롭다운 찾기
                herb_select = new_row.locator('.herb-select-compound')

                if herb_select.count() > 0:
                    print("✓ 약재 선택 드롭다운 발견")

                    # 드롭다운 옵션 확인
                    time.sleep(1)  # 드롭다운이 로드될 시간 확보
                    options = herb_select.locator('option').all()
                    print(f"✓ 약재 옵션: {len(options)}개")

                    # 처음 10개 옵션 출력
                    for idx, option in enumerate(options[:10]):
                        text = option.text_content()
                        value = option.get_attribute('value')
                        print(f"  [{idx}] {text} (value: {value})")

                    # 마스터 약재명이 표시되는지 확인
                    has_master_names = False
                    for option in options:
                        text = option.text_content()
                        # ingredient_code 형식의 value와 한글/한자 형식의 텍스트 확인
                        if '(' in text and ')' in text:  # 한자 포함 형식
                            has_master_names = True
                            break

                    if has_master_names:
                        print("\n✅ 마스터 약재명이 드롭다운에 표시됨!")

                        # 인삼 선택 시도
                        try:
                            herb_select.select_option(label='인삼 (人蔘)')
                            print("✓ 인삼 선택 완료")
                        except:
                            # label이 정확히 일치하지 않으면 부분 매칭
                            for idx, option in enumerate(options):
                                if '인삼' in option.text_content():
                                    herb_select.select_option(index=idx)
                                    print(f"✓ 인삼 선택 완료 (index {idx})")
                                    break

                        time.sleep(1)

                        # 제품 선택 드롭다운 확인
                        product_select = new_row.locator('.product-select')
                        if product_select.count() > 0:
                            print("\n[7] 제품 선택 드롭다운 확인...")
                            time.sleep(1)  # 제품 목록 로드 대기

                            product_options = product_select.locator('option').all()
                            print(f"✓ 제품 옵션: {len(product_options)}개")
                            for idx, option in enumerate(product_options):
                                print(f"  [{idx}] {option.text_content()}")
                    else:
                        print("\n⚠️  마스터 약재명 대신 제품명이 드롭다운에 표시됨")
                        print("(신흥생강, 신흥작약 등의 제품명이 보임)")
                else:
                    print("❌ 약재 선택 드롭다운을 찾을 수 없음")
            else:
                print("❌ 약재 추가 버튼을 찾을 수 없음")

            # 7. 최종 스크린샷
            page.screenshot(path='/tmp/compound_screen_final.png')
            print("\n✓ 최종 스크린샷: /tmp/compound_screen_final.png")

            print("\n" + "=" * 80)
            print("테스트 완료")
            print("=" * 80)

            # 완료
            time.sleep(1)

        except Exception as e:
            print(f"\n❌ 에러 발생: {e}")
            import traceback
            traceback.print_exc()

            # 에러 스크린샷
            page.screenshot(path='/tmp/compound_error.png')
            print("에러 스크린샷: /tmp/compound_error.png")

        finally:
            browser.close()

if __name__ == '__main__':
    test_compound_ginseng_selection()
