"""
config.py

Centralized application configuration for LeafDoctor AI.

Configuration values are loaded from the .env file using
pydantic-settings.

Example .env

APP_NAME=LeafDoctor AI
APP_VERSION=1.0.0

DB_HOST=localhost
DB_PORT=5432
DB_NAME=leafdoctor
DB_USER=postgres
DB_PASSWORD=postgres

GEMINI_API_KEY=xxxxxxxxxxxxxxxxxxxx

UPLOAD_DIR=uploads
DATA_DIR=data

LOG_LEVEL=INFO
DEBUG=False
"""

from functools import lru_cache
from pathlib import Path

from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    """
    Application settings.
    """

    model_config = SettingsConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        case_sensitive=True,
        extra="ignore",
    )

    # ------------------------------------------------------------------
    # Application
    # ------------------------------------------------------------------

    APP_NAME: str = "LeafDoctor AI"
    APP_VERSION: str = "1.0.0"
    DEBUG: bool = False
    LOG_LEVEL: str = "INFO"

    # ------------------------------------------------------------------
    # PostgreSQL
    # ------------------------------------------------------------------

    DB_HOST: str = Field(..., description="PostgreSQL Host")
    DB_PORT: int = Field(..., description="PostgreSQL Port")
    DB_NAME: str = Field(..., description="Database Name")
    DB_USER: str = Field(..., description="Database User")
    DB_PASSWORD: str = Field(..., description="Database Password")

    # ------------------------------------------------------------------
    # Gemini
    # ------------------------------------------------------------------

    GEMINI_API_KEY: str = Field(..., description="Google Gemini API Key")
    GEMINI_MODEL: str = "gemini-2.5-flash"
    GEMINI_TEMPERATURE: float = 0.2
    GEMINI_MAX_OUTPUT_TOKENS: int = 512

    # ------------------------------------------------------------------
    # Directories
    # ------------------------------------------------------------------

    BASE_DIR: Path = Path(__file__).resolve().parent

    UPLOAD_DIR: str = "uploads"
    DATA_DIR: str = "data"

    # ------------------------------------------------------------------
    # API
    # ------------------------------------------------------------------

    MAX_UPLOAD_SIZE_MB: int = 10

    ALLOWED_IMAGE_EXTENSIONS: tuple[str, ...] = (
        ".jpg",
        ".jpeg",
        ".png",
        ".webp",
    )


    # ------------------------------------------------------------------
    # Helpers
    # ------------------------------------------------------------------

    @property
    def database_url(self) -> str:
        return (
            "postgresql+psycopg2://"
            f"{self.DB_USER}:"
            f"{self.DB_PASSWORD}@"
            f"{self.DB_HOST}:"
            f"{self.DB_PORT}/"
            f"{self.DB_NAME}"
        )

    @property
    def upload_path(self) -> Path:
        path = self.BASE_DIR / self.UPLOAD_DIR
        path.mkdir(parents=True, exist_ok=True)
        return path

    @property
    def data_path(self) -> Path:
        path = self.BASE_DIR / self.DATA_DIR
        path.mkdir(parents=True, exist_ok=True)
        return path


@lru_cache
def get_settings() -> Settings:
    """
    Returns a singleton Settings instance.
    """
    return Settings()


settings = get_settings()