from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    """Phase 1 Pydantic Settings — reads all Phase 1 env vars from environment or .env file."""

    model_config = SettingsConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        extra="ignore",
        env_list_separator=",",
    )

    # PostgreSQL
    database_url: str = "postgresql+psycopg://docuvault_app:changeme_app@postgres:5432/docuvault"
    database_migrate_url: str = "postgresql+psycopg://docuvault_migrate:changeme_migrate@postgres:5432/docuvault"

    # MinIO
    minio_endpoint: str = "minio:9000"
    minio_access_key: str = "docuvault_app"
    minio_secret_key: str = "changeme_minio_app"
    minio_bucket: str = "docuvault"
    # RESEARCH.md Finding 3 — browser-resolvable hostname for presigned URLs.
    # Empty string means fall back to minio_endpoint inside MinIOBackend.
    minio_public_endpoint: str = ""

    # Redis / Celery
    redis_url: str = "redis://:changeme_redis@redis:6379/0"

    # Security (Phase 2 — documented now, not read by Phase 1 code paths)
    secret_key: str = "CHANGEME"

    # Auth / JWT (Phase 2)
    access_token_expire_minutes: int = 15
    refresh_token_expire_days: int = 30

    # SMTP (Phase 2 — D-01)
    smtp_host: str = ""
    smtp_port: int = 587
    smtp_user: str = ""
    smtp_password: str = ""
    smtp_from: str = "noreply@docuvault.local"

    # Admin bootstrap (Phase 2 — D-04)
    admin_email: str = ""
    admin_password: str = ""

    # CORS (Phase 2 — D-09)
    cors_origins: list[str] = ["http://localhost:5173"]

    # Frontend URL — used to build password reset links (D-02, D-03)
    frontend_url: str = "http://localhost:5173"

    # AI classification defaults (Phase 3 — D-13, D-15)
    system_prompt: str = ""              # SYSTEM_PROMPT env var; hardcoded fallback lives in classifier.py
    default_ai_provider: str = "ollama"  # DEFAULT_AI_PROVIDER env var
    default_ai_model: str = "llama3.2"   # DEFAULT_AI_MODEL env var

    # Cloud Storage (Phase 5)
    # master key for HKDF per-user credential encryption — must be overridden in production
    cloud_creds_key: str = "CHANGEME-32-bytes-padded!!"
    google_client_id: str = ""
    google_client_secret: str = ""
    onedrive_client_id: str = ""
    onedrive_client_secret: str = ""
    # "common" works for both personal and org accounts
    onedrive_tenant_id: str = "common"
    # used to construct OAuth callback URLs (e.g. {backend_url}/api/cloud/google/callback)
    backend_url: str = "http://localhost:8000"
    # used to construct OAuth success/error redirect to Vue app (per Phase 5 B4 fix)
    # Note: frontend_url already declared above for Phase 2 (password reset links) — shared field


settings = Settings()
