"""
설정 관리 유틸리티
"""
import os
import yaml
from typing import Any, Dict
from pathlib import Path
from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    """애플리케이션 설정"""

    # PostgreSQL
    POSTGRES_HOST: str = "localhost"
    POSTGRES_PORT: int = 5432
    POSTGRES_DATABASE: str = "meeting_db"
    POSTGRES_USER: str = "postgres"
    POSTGRES_PASSWORD: str = ""

    # Azure OpenAI
    AZURE_OPENAI_API_KEY: str = ""
    AZURE_OPENAI_ENDPOINT: str = ""

    # Azure AI Search
    AZURE_SEARCH_ENDPOINT: str = ""
    AZURE_SEARCH_API_KEY: str = ""

    # Claude AI
    CLAUDE_API_KEY: str = ""

    # Redis
    REDIS_PASSWORD: str = ""

    # Azure Event Hub
    EVENTHUB_CONNECTION_STRING: str = ""
    EVENTHUB_NAME: str = ""
    AZURE_EVENTHUB_CONSUMER_GROUP: str = "$Default"
    AZURE_STORAGE_CONNECTION_STRING: str = ""
    AZURE_STORAGE_CONTAINER_NAME: str = ""

    class Config:
        # rag 디렉토리 기준으로 .env 파일 경로 설정
        env_file = str(Path(__file__).parent.parent.parent / ".env")
        case_sensitive = True


def load_config(config_path: str = "config.yaml") -> Dict[str, Any]:
    """
    설정 파일 로딩

    Args:
        config_path: 설정 파일 경로

    Returns:
        설정 딕셔너리
    """
    # 환경변수 로딩
    settings = Settings()

    # YAML 파일 로딩
    config_file = Path(config_path)
    if not config_file.exists():
        raise FileNotFoundError(f"설정 파일을 찾을 수 없습니다: {config_path}")

    with open(config_file, "r", encoding="utf-8") as f:
        config = yaml.safe_load(f)

    # 환경변수로 대체
    def replace_env_vars(obj: Any) -> Any:
        """재귀적으로 환경변수 치환"""
        if isinstance(obj, dict):
            return {k: replace_env_vars(v) for k, v in obj.items()}
        elif isinstance(obj, list):
            return [replace_env_vars(item) for item in obj]
        elif isinstance(obj, str) and obj.startswith("${") and obj.endswith("}"):
            env_var = obj[2:-1]
            return getattr(settings, env_var, "")
        return obj

    config = replace_env_vars(config)

    return config


def get_database_url(config: Dict[str, Any]) -> str:
    """
    PostgreSQL 데이터베이스 URL 생성

    Args:
        config: 설정 딕셔너리

    Returns:
        데이터베이스 URL
    """
    pg = config["postgres"]
    return (
        f"postgresql://{pg['user']}:{pg['password']}"
        f"@{pg['host']}:{pg['port']}/{pg['database']}"
    )


def get_redis_url(config: Dict[str, Any]) -> str:
    """
    Redis URL 생성

    Args:
        config: 설정 딕셔너리

    Returns:
        Redis URL
    """
    redis = config["redis"]
    password = redis.get("password", "")

    if password:
        return f"redis://:{password}@{redis['host']}:{redis['port']}/{redis['db']}"
    else:
        return f"redis://{redis['host']}:{redis['port']}/{redis['db']}"
