"""
Pydantic settings for content pipeline.
Loads from .env with fallback to parent directory .env.
"""

from pathlib import Path
from typing import Optional

from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict


def find_env_file() -> Optional[Path]:
    """Find .env file in current or parent directory."""
    current = Path(__file__).parent.parent / ".env"
    if current.exists():
        return current

    parent = Path(__file__).parent.parent.parent / ".env"
    if parent.exists():
        return parent

    return None


class Settings(BaseSettings):
    """Application settings loaded from environment variables."""

    model_config = SettingsConfigDict(
        env_file=find_env_file(),
        env_file_encoding="utf-8",
        extra="ignore",
    )

    # Gemini API
    gemini_api_key: str = Field(..., alias="GEMINI_API_KEY")
    gemini_fallback_api_key: Optional[str] = Field(None, alias="GEMINI_FALLBACK_API_KEY")

    # Fal.ai API
    fal_api_key: str = Field(..., alias="FAL_API_KEY")

    # WordPress
    wp_url: str = Field("http://localhost:1010", alias="WP_URL")
    wp_username: str = Field(..., alias="WP_USERNAME")
    wp_application_password: str = Field(..., alias="WP_APPLICATION_PASSWORD")

    # Database
    db_host: str = Field("127.0.0.1", alias="DB_HOST")
    db_port: int = Field(3310, alias="DB_PORT")
    db_name: str = Field("wordpress", alias="DB_NAME")
    db_user: str = Field("root", alias="DB_USER")
    db_password: str = Field(..., alias="DB_PASSWORD")

    # Pipeline
    log_level: str = Field("INFO", alias="LOG_LEVEL")
    dry_run: bool = Field(False, alias="DRY_RUN")

    @property
    def db_config(self) -> dict:
        """Return database connection config dict."""
        return {
            "host": self.db_host,
            "port": self.db_port,
            "database": self.db_name,
            "user": self.db_user,
            "password": self.db_password,
        }

    @property
    def wp_auth(self) -> tuple[str, str]:
        """Return WordPress basic auth tuple."""
        return (self.wp_username, self.wp_application_password)


def get_settings() -> Settings:
    """Get cached settings instance."""
    return Settings()
