import os
from dotenv import load_dotenv
from pathlib import Path

# ──────────────────────────────────────────────────────────────────────────────
# Carga de variables de entorno por capas:
#
#   1. .env              → valores base / compartidos
#   2. .env.{APP_ENV}    → overrides específicos del entorno (override=True)
#
#   APP_ENV se lee del sistema operativo (variable de shell / docker env).
#   Valores: "development" (default) | "production"
#
#   Ejemplo de uso:
#     APP_ENV=production python run_api.py
# ──────────────────────────────────────────────────────────────────────────────
_BASE = Path(__file__).parent.parent

# Capa 1: base
load_dotenv(dotenv_path=_BASE / ".env")

# Capa 2: específica del entorno (sobreescribe la base)
APP_ENV = os.getenv("APP_ENV", "")
_env_file = _BASE / f".env.{APP_ENV}"
if _env_file.exists():
    load_dotenv(dotenv_path=_env_file, override=True)


class Settings:
    APP_ENV: str = APP_ENV

    # LLM y MCP
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    MCP_SERVER_URL = os.getenv("MCP_SERVER_URL", "")
    MODEL_NAME = os.getenv("MODEL_NAME", "")

    # Configuration Neo4j (GraphRAG)
    NEO4J_URI = os.getenv("NEO4J_URI", "")
    NEO4J_USER = os.getenv("NEO4J_USER", "")
    NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD", "")
    NEO4J_DATABASE = os.getenv("NEO4J_DATABASE", "")

    # Configuration GraphRAG
    GRAPHRAG_MAX_DEPTH = int(os.getenv("GRAPHRAG_MAX_DEPTH", "2"))
    GRAPHRAG_MAX_RESULTS = int(os.getenv("GRAPHRAG_MAX_RESULTS", "10"))
    EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "text-embedding-3-small")
    EMBEDDING_DIMENSIONS = int(os.getenv("EMBEDDING_DIMENSIONS", "1536"))

    # Configuración Redis
    REDIS_HOST = os.getenv("REDIS_HOST", "")
    REDIS_PORT = int(os.getenv("REDIS_PORT", ""))
    
    REDIS_PASSWORD = os.getenv("REDIS_PASSWORD", None)
    REDIS_DB = int(os.getenv("REDIS_DB", "0"))
    REDIS_SESSION_TTL = int(os.getenv("REDIS_SESSION_TTL", str(3600 * 24)))  # Default: 24h
    EMBEDDING_CACHE_TTL = int(os.getenv("EMBEDDING_CACHE_TTL", str(3600 * 24)))  # Default: 24h
    # SSL automático si el puerto es 6380 (Azure) o si se fuerza con REDIS_SSL=true
    _redis_ssl_env = os.getenv("REDIS_SSL", "").lower()
    REDIS_SSL: bool = (
        _redis_ssl_env == "true"
        or (REDIS_PORT == 6380 and _redis_ssl_env != "false")
    )

    # API externa de búsqueda de productos
    PRODUCTS_SEARCH_API_URL = os.getenv("PRODUCTS_SEARCH_API_URL", "http://localhost:3000/api/products/search")

    # Keycloak / OAuth2 JWT
    KEYCLOAK_ISSUER_URI = os.getenv("KEYCLOAK_ISSUER_URI", "https://login.tws2.io/auth/realms/lhia")
    KEYCLOAK_CLIENT_ID = os.getenv("KEYCLOAK_CLIENT_ID", "logueoBack")
    KEYCLOAK_ENABLED = os.getenv("KEYCLOAK_ENABLED", "true").lower() == "true"

    # API Key para endpoints internos (ej: /products/sync)
    SYNC_API_KEY = os.getenv("SYNC_API_KEY", "")

    # Documentación Swagger/ReDoc
    ENABLE_DOCS = os.getenv("ENABLE_DOCS", "false").lower() == "true"


settings = Settings()
