#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
신규 약재 추가 드롭다운 버그 테스트
십전대보탕 조제 시 새로운 약재 추가가 안되는 문제 확인
"""

import requests
import json
from datetime import datetime

BASE_URL = "http://localhost:5001"

def test_herb_dropdown_api():
    """약재 목록 API 테스트"""
    print("\n" + "="*80)
    print("1. 약재 목록 API 테스트")
    print("="*80)

    # 1. 전체 약재 목록 조회
    response = requests.get(f"{BASE_URL}/api/herbs")
    print(f"상태 코드: {response.status_code}")

    if response.status_code == 200:
        herbs = response.json()
        print(f"총 약재 수: {len(herbs)}")

        # 처음 5개만 출력
        print("\n처음 5개 약재:")
        for herb in herbs[:5]:
            print(f"  - ID: {herb.get('herb_item_id')}, 이름: {herb.get('herb_name')}, 코드: {herb.get('insurance_code')}")
    else:
        print(f"오류: {response.text}")

    return response.status_code == 200

def test_formula_ingredients():
    """십전대보탕 처방 구성 테스트"""
    print("\n" + "="*80)
    print("2. 십전대보탕 처방 구성 조회")
    print("="*80)

    # 십전대보탕 ID 찾기
    response = requests.get(f"{BASE_URL}/api/formulas")
    formulas = response.json()

    sipjeon_id = None
    for formula in formulas:
        if '십전대보탕' in formula.get('formula_name', ''):
            sipjeon_id = formula['formula_id']
            print(f"십전대보탕 ID: {sipjeon_id}")
            break

    if not sipjeon_id:
        print("십전대보탕을 찾을 수 없습니다")
        return False

    # 처방 구성 조회
    response = requests.get(f"{BASE_URL}/api/formulas/{sipjeon_id}/ingredients")
    if response.status_code == 200:
        ingredients = response.json()
        print(f"\n십전대보탕 구성 약재 ({len(ingredients)}개):")

        ingredient_codes = []
        for ing in ingredients:
            print(f"  - {ing.get('herb_name')} ({ing.get('ingredient_code')}): {ing.get('grams_per_cheop')}g")
            ingredient_codes.append(ing.get('ingredient_code'))

        return ingredient_codes
    else:
        print(f"오류: {response.text}")
        return []

def test_available_herbs_for_compound():
    """조제 시 사용 가능한 약재 목록 테스트"""
    print("\n" + "="*80)
    print("3. 조제용 약재 목록 API 테스트")
    print("="*80)

    # 재고가 있는 약재만 조회하는 API가 있는지 확인
    endpoints = [
        "/api/herbs",
        "/api/herbs/available",
        "/api/herbs-with-inventory"
    ]

    for endpoint in endpoints:
        print(f"\n테스트: {endpoint}")
        try:
            response = requests.get(f"{BASE_URL}{endpoint}")
            if response.status_code == 200:
                herbs = response.json()
                print(f"  ✓ 성공 - {len(herbs)}개 약재")

                # 재고 정보 확인
                if herbs and len(herbs) > 0:
                    sample = herbs[0]
                    print(f"  샘플 데이터: {sample}")
                    if 'quantity_onhand' in sample or 'total_quantity' in sample:
                        print("  → 재고 정보 포함됨")
            else:
                print(f"  ✗ 실패 - 상태코드: {response.status_code}")
        except Exception as e:
            print(f"  ✗ 오류: {e}")

def check_frontend_code():
    """프론트엔드 코드에서 약재 추가 부분 확인"""
    print("\n" + "="*80)
    print("4. 프론트엔드 코드 분석")
    print("="*80)

    print("""
app.js의 약재 추가 관련 주요 함수:
1. loadHerbOptions() - 약재 드롭다운 로드
2. addIngredientRow() - 약재 행 추가
3. loadOriginOptions() - 원산지 옵션 로드

문제 가능성:
- loadHerbOptions() 함수가 제대로 호출되지 않음
- API 엔드포인트가 잘못됨
- 드롭다운 element 선택자 오류
- 이벤트 바인딩 문제
""")

def test_with_playwright():
    """Playwright로 실제 UI 테스트"""
    print("\n" + "="*80)
    print("5. Playwright UI 테스트 스크립트 생성")
    print("="*80)

    test_code = '''from playwright.sync_api import sync_playwright
import time

def test_herb_dropdown():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()

        # 1. 조제 페이지로 이동
        page.goto("http://localhost:5001")
        page.click('a[href="#compound"]')
        time.sleep(1)

        # 2. 십전대보탕 선택
        page.select_option('#compoundFormula', label='십전대보탕')
        time.sleep(1)

        # 3. 새 약재 추가 버튼 클릭
        page.click('#addIngredientBtn')
        time.sleep(1)

        # 4. 드롭다운 확인
        dropdown = page.locator('.herb-select').last
        options = dropdown.locator('option').all_text_contents()

        print(f"드롭다운 옵션 수: {len(options)}")
        print(f"처음 5개: {options[:5]}")

        browser.close()

if __name__ == "__main__":
    test_herb_dropdown()
'''

    print("Playwright 테스트 코드를 test_ui_dropdown.py 파일로 저장합니다.")

    with open('/root/kdrug/test_ui_dropdown.py', 'w') as f:
        f.write(test_code)

    return True

def main():
    """메인 테스트 실행"""
    print("\n" + "="*80)
    print("신규 약재 추가 드롭다운 버그 테스트")
    print("="*80)

    # 1. API 테스트
    if not test_herb_dropdown_api():
        print("\n❌ 약재 목록 API에 문제가 있습니다")
        return

    # 2. 처방 구성 테스트
    ingredient_codes = test_formula_ingredients()

    # 3. 조제용 약재 테스트
    test_available_herbs_for_compound()

    # 4. 프론트엔드 코드 분석
    check_frontend_code()

    # 5. Playwright 테스트 생성
    test_with_playwright()

    print("\n" + "="*80)
    print("테스트 완료 - app.js 파일을 확인하여 문제를 찾아보겠습니다")
    print("="*80)

if __name__ == "__main__":
    main()