import os
from datetime import timedelta
from dotenv import load_dotenv

# Cargar variables de entorno desde archivo .env
load_dotenv()

# Directorio base donde se ejecuta la aplicación
basedir = os.path.abspath(os.path.dirname(__file__))


class Config:
    """Configuración base."""

    # Seguridad
    SECRET_KEY = os.environ.get("SECRET_KEY") or "clave-secreta-por-defecto"
    BCRYPT_LOG_ROUNDS = 12
    WTF_CSRF_ENABLED = True

    # Sesión
    SESSION_TYPE = "filesystem"
    SESSION_FILE_DIR = os.path.join(basedir, "flask_session")
    SESSION_PERMANENT = True
    PERMANENT_SESSION_LIFETIME = timedelta(days=1)
    SESSION_USE_SIGNER = True

    # Caché
    CACHE_TYPE = "SimpleCache"
    CACHE_DEFAULT_TIMEOUT = 300

    # Almacenamiento
    STORAGE_PATH = os.environ.get("STORAGE_PATH") or os.path.join(basedir, "storage")
    MAX_CONTENT_LENGTH = 50 * 1024 * 1024  # 50 MB

    # Configuración de la aplicación
    APP_NAME = "Arch"
    ADMIN_EMAIL = os.environ.get("ADMIN_EMAIL") or "admin@example.com"
    ADMIN_PASSWORD = os.environ.get("ADMIN_PASSWORD") or "admin"

    @staticmethod
    def init_app(app):
        """Inicialización adicional de la aplicación."""
        os.makedirs(Config.SESSION_FILE_DIR, exist_ok=True)


class DevelopmentConfig(Config):
    """Configuración para desarrollo."""

    DEBUG = True
    TESTING = False


class TestingConfig(Config):
    """Configuración para pruebas."""

    TESTING = True
    DEBUG = True
    WTF_CSRF_ENABLED = False
    BCRYPT_LOG_ROUNDS = 4  # más rápido para pruebas
    STORAGE_PATH = os.path.join(basedir, "test_storage")


class ProductionConfig(Config):
    """Configuración para producción."""

    DEBUG = False
    TESTING = False

    # Override secret key in production
    SECRET_KEY = os.environ.get("SECRET_KEY")

    # Opciones de seguridad más estrictas
    SESSION_COOKIE_SECURE = True
    SESSION_COOKIE_HTTPONLY = True
    REMEMBER_COOKIE_SECURE = True
    REMEMBER_COOKIE_HTTPONLY = True

    @staticmethod
    def init_app(app):
        Config.init_app(app)

        # Verificar SECRET_KEY
        if app.config["SECRET_KEY"] == "clave-secreta-por-defecto":
            import warnings

            warnings.warn("SECRET_KEY no configurada para producción!")


# Mapeo de configuraciones
config = {
    "development": DevelopmentConfig,
    "testing": TestingConfig,
    "production": ProductionConfig,
    "default": DevelopmentConfig,
}
