#!/usr/bin/env python3
"""약재 정보 페이지 테스트 - 렌더링 문제 수정 후 검증"""

import requests
import json
import re
from datetime import datetime

BASE_URL = "http://localhost:5001"


def test_html_structure():
    """HTML 구조 검증 - herb-info가 content-area 안에 있는지 확인"""
    print("1. HTML 구조 검증...")
    response = requests.get(f"{BASE_URL}/")
    if response.status_code != 200:
        print(f"   FAIL: 페이지 로드 실패 {response.status_code}")
        return False

    content = response.text

    # herb-info가 col-md-10 content-area 안에 있는지 확인
    idx_content = content.find('col-md-10 content-area')
    idx_herb_info = content.find('id="herb-info"')

    if idx_content < 0:
        print("   FAIL: col-md-10 content-area 찾을 수 없음")
        return False
    if idx_herb_info < 0:
        print("   FAIL: herb-info div 찾을 수 없음")
        return False

    if idx_herb_info > idx_content:
        print("   PASS: herb-info가 content-area 안에 올바르게 위치함")
    else:
        print("   FAIL: herb-info가 content-area 밖에 있음!")
        return False

    # efficacyFilter ID 중복 검사
    count_efficacy = content.count('id="efficacyFilter"')
    if count_efficacy > 1:
        print(f"   FAIL: id=\"efficacyFilter\" 중복 {count_efficacy}개 발견!")
        return False
    else:
        print(f"   PASS: id=\"efficacyFilter\" 중복 없음 (개수: {count_efficacy})")

    # herbInfoEfficacyFilter 존재 확인
    if 'id="herbInfoEfficacyFilter"' in content:
        print("   PASS: herbInfoEfficacyFilter ID 정상 존재")
    else:
        print("   FAIL: herbInfoEfficacyFilter ID 없음!")
        return False

    return True


def test_efficacy_tags():
    """효능 태그 조회 API 검증"""
    print("\n2. 효능 태그 목록 조회...")
    response = requests.get(f"{BASE_URL}/api/efficacy-tags")
    if response.status_code != 200:
        print(f"   FAIL: {response.status_code}")
        return False

    tags = response.json()
    if not isinstance(tags, list):
        print(f"   FAIL: 응답이 리스트가 아님 - {type(tags)}")
        return False

    print(f"   PASS: {len(tags)}개의 효능 태그 조회 성공")
    for tag in tags[:3]:
        print(f"     - {tag.get('name', '')}: {tag.get('description', '')}")
    return True


def test_herb_masters_api():
    """약재 마스터 목록 + herb_id 포함 여부 검증"""
    print("\n3. 약재 마스터 목록 조회 (herb_id 포함 여부 확인)...")
    response = requests.get(f"{BASE_URL}/api/herbs/masters")
    if response.status_code != 200:
        print(f"   FAIL: {response.status_code}")
        return False

    result = response.json()
    if not result.get('success'):
        print(f"   FAIL: success=False")
        return False

    herbs = result.get('data', [])
    print(f"   PASS: {len(herbs)}개의 약재 조회 성공")

    if not herbs:
        print("   FAIL: 약재 데이터 없음")
        return False

    first = herbs[0]

    # herb_id 확인
    if 'herb_id' in first:
        print(f"   PASS: herb_id 필드 존재 (값: {first['herb_id']})")
    else:
        print(f"   FAIL: herb_id 필드 누락! 키 목록: {list(first.keys())}")
        return False

    # ingredient_code 확인
    if 'ingredient_code' in first:
        print(f"   PASS: ingredient_code 필드 존재")
    else:
        print("   FAIL: ingredient_code 필드 누락!")
        return False

    # efficacy_tags가 리스트인지 확인
    if isinstance(first.get('efficacy_tags'), list):
        print(f"   PASS: efficacy_tags가 리스트 형식")
    else:
        print(f"   FAIL: efficacy_tags 형식 오류: {first.get('efficacy_tags')}")
        return False

    return True


def test_herb_extended_info():
    """약재 확장 정보 조회 API 검증"""
    print("\n4. 약재 확장 정보 조회 (herb_id=1 기준)...")
    response = requests.get(f"{BASE_URL}/api/herbs/1/extended")
    if response.status_code != 200:
        print(f"   FAIL: {response.status_code}")
        return False

    info = response.json()
    if not isinstance(info, dict):
        print(f"   FAIL: 응답이 dict가 아님")
        return False

    print(f"   PASS: herb_id=1 확장 정보 조회 성공")
    print(f"     - herb_name: {info.get('herb_name', '-')}")
    print(f"     - name_korean: {info.get('name_korean', '-')}")
    print(f"     - property: {info.get('property', '-')}")
    return True


def test_herb_masters_has_extended_fields():
    """약재 마스터 목록에 확장 정보(property, main_effects)가 포함되는지 검증"""
    print("\n5. 약재 마스터에 확장 정보 필드 포함 여부...")
    response = requests.get(f"{BASE_URL}/api/herbs/masters")
    result = response.json()
    herbs = result.get('data', [])

    required_fields = ['ingredient_code', 'herb_name', 'herb_id', 'has_stock',
                       'efficacy_tags', 'property', 'main_effects']
    first = herbs[0] if herbs else {}
    missing = [f for f in required_fields if f not in first]

    if missing:
        print(f"   FAIL: 누락된 필드: {missing}")
        return False

    print(f"   PASS: 필수 필드 모두 존재: {required_fields}")
    return True


def main():
    print("=== 약재 정보 페이지 렌더링 수정 검증 테스트 ===")
    print(f"시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print(f"서버: {BASE_URL}")
    print("-" * 50)

    results = []
    results.append(("HTML 구조 검증", test_html_structure()))
    results.append(("효능 태그 API", test_efficacy_tags()))
    results.append(("약재 마스터 API (herb_id)", test_herb_masters_api()))
    results.append(("약재 확장 정보 API", test_herb_extended_info()))
    results.append(("약재 마스터 필드 완전성", test_herb_masters_has_extended_fields()))

    print("\n" + "=" * 50)
    success = sum(1 for _, r in results if r)
    total = len(results)
    print(f"테스트 결과: {success}/{total} 성공")
    for name, result in results:
        status = "PASS" if result else "FAIL"
        print(f"  [{status}] {name}")

    if success == total:
        print("\n모든 테스트 통과. 약재 정보 페이지가 정상적으로 동작해야 합니다.")
    else:
        print(f"\n{total - success}개 테스트 실패. 추가 수정이 필요합니다.")

    return success == total


if __name__ == "__main__":
    main()
