import os
from dotenv import load_dotenv

# Cargar variables desde .env
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
load_dotenv(os.path.join(BASE_DIR, ".env"))


def env_bool(name: str, default: bool = False) -> bool:
    val = os.getenv(name, str(default))
    return str(val).strip().lower() in ("1", "true", "yes", "y", "on")


def env_set(name: str, default_csv: str) -> set[str]:
    raw = os.getenv(name, default_csv)
    return set([p.strip() for p in raw.split(",") if p.strip()])


class Config:
    """Configuración base para todas las apps Flask."""

    # --- General ---
    APP_ENV = os.getenv("APP_ENV", "dev")
    FLASK_ENV = os.getenv("FLASK_ENV", "development")
    FLASK_DEBUG = env_bool("FLASK_DEBUG", True)
    SECRET_KEY = os.getenv("SECRET_KEY", "changeme123")

    # --- JWT ---
    JWT_SECRET = os.getenv("JWT_SECRET", "supersecretojwt")
    JWT_ALGORITHM = os.getenv("JWT_ALGORITHM", "HS256")

    # --- OpenAI ---
    OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini")
    # Nota: la API key se obtiene desde dev.key según tu flujo actual.

    # --- Uploads ---
    MAX_UPLOAD_MB = int(os.getenv("MAX_UPLOAD_MB", 25))
    MAX_CONTENT_LENGTH = MAX_UPLOAD_MB * 1024 * 1024  # bytes
    ALLOWED_EXTENSIONS = env_set("ALLOWED_EXTENSIONS", "pdf,png,jpg,jpeg")

    # --- Base de datos ---
    DB_ENGINE = os.getenv("DB_ENGINE", "mysql+pymysql")
    DB_HOST = os.getenv("DB_HOST", "localhost")
    DB_PORT = os.getenv("DB_PORT", "3306")
    DB_NAME = os.getenv("DB_NAME", "flask_server")
    DB_USER = os.getenv("DB_USER", "root")
    DB_PASSWORD = os.getenv("DB_PASSWORD", "")

    SQLALCHEMY_DATABASE_URI = (
        f"{DB_ENGINE}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
    )
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # --- Logging ---
    ENABLE_DEBUG_LOGS = env_bool("ENABLE_DEBUG_LOGS", True)

    # --- CORS (opcional para desarrollo) ---
    DEV_ALLOWED_ORIGINS = os.getenv("DEV_ALLOWED_ORIGINS", "")
    DEV_BYPASS_JWT = env_bool("DEV_BYPASS_JWT", False)
    DEV_IP_WHITELIST = [p.strip() for p in os.getenv("DEV_IP_WHITELIST", "127.0.0.1,::1").split(",")]

    @staticmethod
    def init_app(app):
        """Hook opcional para inicializaciones adicionales."""
        if Config.ENABLE_DEBUG_LOGS:
            print(f"[CONFIG] Flask environment: {Config.FLASK_ENV}")
            print(f"[CONFIG] DB: {Config.DB_ENGINE} @ {Config.DB_HOST}")
            print(f"[CONFIG] Upload limit: {Config.MAX_UPLOAD_MB} MB")


class DevelopmentConfig(Config):
    DEBUG = True
    TESTING = False


class ProductionConfig(Config):
    DEBUG = False
    TESTING = False


class TestingConfig(Config):
    DEBUG = True
    TESTING = True


# Mapa de configuraciones (por si en el futuro decides seleccionar por nombre)
config = {
    "development": DevelopmentConfig,
    "production": ProductionConfig,
    "testing": TestingConfig,
}
