"""
Vector DB 통합 시스템 설정 검증 스크립트

사용법: python scripts/validate_setup.py
"""
import sys
import os
from pathlib import Path
from typing import List, Tuple

# 프로젝트 루트 디렉토리
project_root = Path(__file__).parent.parent


def check_file_exists(file_path: Path, description: str) -> bool:
    """파일 존재 여부 확인"""
    exists = file_path.exists()
    status = "✓" if exists else "✗"
    print(f"  {status} {description}: {file_path.name}")
    return exists


def check_directory_exists(dir_path: Path, description: str) -> bool:
    """디렉토리 존재 여부 확인"""
    exists = dir_path.exists() and dir_path.is_dir()
    status = "✓" if exists else "✗"
    print(f"  {status} {description}: {dir_path.name}/")
    return exists


def check_python_version() -> bool:
    """Python 버전 확인"""
    version = sys.version_info
    is_valid = version.major == 3 and version.minor >= 9
    status = "✓" if is_valid else "✗"
    print(f"  {status} Python 버전: {version.major}.{version.minor}.{version.micro}")
    if not is_valid:
        print(f"     → Python 3.9 이상이 필요합니다")
    return is_valid


def check_dependencies() -> bool:
    """필수 패키지 설치 확인"""
    required_packages = [
        "fastapi",
        "uvicorn",
        "psycopg2",
        "openai",
        "anthropic",
        "azure.search.documents",
        "pydantic",
        "pyyaml",
        "tenacity"
    ]

    missing_packages = []
    for package in required_packages:
        try:
            __import__(package.replace("-", "_").split(".")[0])
            print(f"  ✓ {package}")
        except ImportError:
            print(f"  ✗ {package}")
            missing_packages.append(package)

    if missing_packages:
        print(f"\n  → 누락된 패키지를 설치하세요: pip install {' '.join(missing_packages)}")
        return False
    return True


def check_env_variables() -> Tuple[bool, List[str]]:
    """환경 변수 설정 확인"""
    required_vars = [
        "POSTGRES_HOST",
        "POSTGRES_PORT",
        "POSTGRES_DATABASE",
        "POSTGRES_USER",
        "POSTGRES_PASSWORD",
        "AZURE_OPENAI_API_KEY",
        "AZURE_OPENAI_ENDPOINT",
        "AZURE_SEARCH_ENDPOINT",
        "AZURE_SEARCH_API_KEY",
        "CLAUDE_API_KEY"
    ]

    # .env 파일 확인
    env_file = project_root / ".env"
    if env_file.exists():
        print(f"  ✓ .env 파일 존재")
        # .env 파일 로드 시뮬레이션
        with open(env_file, 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if '=' in line and not line.startswith('#'):
                    key, value = line.split('=', 1)
                    if value and value != f"your_{key.lower()}_here":
                        os.environ[key] = value
    else:
        print(f"  ✗ .env 파일 없음")
        print(f"     → .env.example을 .env로 복사하고 실제 값으로 수정하세요")

    missing_vars = []
    for var in required_vars:
        value = os.environ.get(var, "")
        has_value = bool(value) and not value.startswith("your_")

        if has_value:
            # API 키는 앞 4자리만 표시
            if "KEY" in var or "PASSWORD" in var:
                display_value = value[:4] + "..." if len(value) > 4 else "***"
            else:
                display_value = value
            print(f"  ✓ {var}: {display_value}")
        else:
            print(f"  ✗ {var}: 설정 필요")
            missing_vars.append(var)

    return len(missing_vars) == 0, missing_vars


def check_data_files() -> bool:
    """샘플 데이터 파일 확인"""
    data_dir = project_root.parent / "design/aidata"
    meet_ref_file = project_root.parent / "design/meet-ref.json"

    all_exists = True

    # 용어 데이터 파일
    term_files = ["terms-01.json", "terms-02.json", "terms-03.json", "terms-04.json"]
    for filename in term_files:
        file_path = data_dir / filename
        exists = file_path.exists()
        status = "✓" if exists else "✗"
        print(f"  {status} {filename}")
        all_exists = all_exists and exists

    # 관련 문서 데이터 파일
    exists = meet_ref_file.exists()
    status = "✓" if exists else "✗"
    print(f"  {status} meet-ref.json")
    all_exists = all_exists and exists

    if not all_exists:
        print(f"\n  → 데이터 파일이 design/ 디렉토리에 있는지 확인하세요")

    return all_exists


def main():
    """메인 검증 함수"""
    print("\n" + "=" * 70)
    print("Vector DB 통합 시스템 설정 검증")
    print("=" * 70 + "\n")

    results = {}

    # 1. Python 버전 확인
    print("1. Python 버전 확인")
    results["python"] = check_python_version()
    print()

    # 2. 프로젝트 구조 확인
    print("2. 프로젝트 구조 확인")
    structure_checks = [
        (project_root / "config.yaml", "설정 파일"),
        (project_root / "requirements.txt", "의존성 파일"),
        (project_root / "README.md", "문서"),
        (project_root / "src", "소스 디렉토리"),
        (project_root / "src/models", "모델 디렉토리"),
        (project_root / "src/db", "DB 디렉토리"),
        (project_root / "src/services", "서비스 디렉토리"),
        (project_root / "src/api", "API 디렉토리"),
        (project_root / "scripts", "스크립트 디렉토리"),
        (project_root / "tests", "테스트 디렉토리")
    ]

    structure_ok = True
    for path, desc in structure_checks:
        if path.is_dir():
            structure_ok = check_directory_exists(path, desc) and structure_ok
        else:
            structure_ok = check_file_exists(path, desc) and structure_ok

    results["structure"] = structure_ok
    print()

    # 3. 의존성 패키지 확인
    print("3. 의존성 패키지 확인")
    results["dependencies"] = check_dependencies()
    print()

    # 4. 환경 변수 확인
    print("4. 환경 변수 확인")
    env_ok, missing_vars = check_env_variables()
    results["environment"] = env_ok
    print()

    # 5. 데이터 파일 확인
    print("5. 샘플 데이터 파일 확인")
    results["data_files"] = check_data_files()
    print()

    # 결과 요약
    print("=" * 70)
    print("검증 결과 요약")
    print("=" * 70)

    all_passed = all(results.values())

    for category, passed in results.items():
        status = "✓ 통과" if passed else "✗ 실패"
        print(f"  {status}: {category}")

    print()

    if all_passed:
        print("🎉 모든 검증을 통과했습니다!")
        print()
        print("다음 단계:")
        print("  1. 데이터베이스 초기화: python scripts/load_terms.py")
        print("  2. 관련자료 로딩: python scripts/load_documents.py")
        print("  3. API 서버 실행: python -m src.api.main")
        print("  4. API 문서 확인: http://localhost:8000/docs")
    else:
        print("⚠️  일부 검증에 실패했습니다.")
        print()
        print("실패한 항목을 확인하고 수정한 후 다시 실행하세요.")

        if not results["dependencies"]:
            print("\n의존성 설치 명령:")
            print("  pip install -r requirements.txt")

        if not results["environment"]:
            print("\n환경 변수 설정 방법:")
            print("  1. .env.example을 .env로 복사")
            print("  2. .env 파일을 열어 실제 값으로 수정")

    print()
    print("=" * 70)

    return 0 if all_passed else 1


if __name__ == "__main__":
    sys.exit(main())
