"""
Configuración del Sistema de Webhooks Rappi
CierresMIG - 2025
"""

import os
from urllib.parse import quote_plus

class Config:
    """Configuración base"""
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'webhooks_secret_2025_cierresmig'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_timeout': 30,
        'pool_recycle': 3600,
        'pool_pre_ping': True
    }
    
    # Configuración de la aplicación
    WEBHOOK_BASE_URL = 'https://cierresmig.online'
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 16MB máximo
    
    # Timeouts
    REQUEST_TIMEOUT = 30
    DATABASE_TIMEOUT = 30
    
    # Logging
    LOG_LEVEL = 'INFO'
    LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    
    # Configuración de Rappi
    RAPPI_WEBHOOK_SECRET = os.environ.get('RAPPI_WEBHOOK_SECRET')
    RAPPI_SUPPORTED_EVENTS = [
        'NEW_ORDER',
        'ORDER_EVENT_CANCEL',
        'ORDER_OTHER_EVENT',
        'PING',
        'MENU_APPROVED',
        'MENU_REJECTED',
        'STORE_CONNECTIVITY',
        'ORDER_RT_TRACKING'
    ]
    
    # Configuración de autenticación básica (opcional)
    BASIC_AUTH_USERNAME = os.environ.get('BASIC_AUTH_USERNAME')
    BASIC_AUTH_PASSWORD = os.environ.get('BASIC_AUTH_PASSWORD')
    
    @staticmethod
    def init_app(app):
        """Inicializar configuración de la aplicación"""
        pass

class DevelopmentConfig(Config):
    """Configuración de desarrollo"""
    DEBUG = True
    
    # Base de datos de desarrollo
    DB_SERVER = '194.163.45.32'
    DB_PORT = '1433'
    DB_NAME = 'RappiWebhooks'
    DB_USER = 'sa'
    DB_PASSWORD = 'Sistemas123*/'
    
    # Construir connection string
    connection_string = (
        f"mssql+pyodbc://{DB_USER}:{quote_plus(DB_PASSWORD)}"
        f"@{DB_SERVER}:{DB_PORT}/{DB_NAME}"
        f"?driver=ODBC+Driver+17+for+SQL+Server"
        f"&TrustServerCertificate=yes"
        f"&Encrypt=yes"
        f"&timeout={Config.DATABASE_TIMEOUT}"
    )
    
    SQLALCHEMY_DATABASE_URI = connection_string

class ProductionConfig(Config):
    """Configuración de producción"""
    DEBUG = False
    
    # En producción, usar variables de entorno
    DB_SERVER = os.environ.get('DB_SERVER', '194.163.45.32')
    DB_PORT = os.environ.get('DB_PORT', '1433')
    DB_NAME = os.environ.get('DB_NAME', 'RappiWebhooks')
    DB_USER = os.environ.get('DB_USER', 'sa')
    DB_PASSWORD = os.environ.get('DB_PASSWORD', 'Sistemas123*/')
    
    connection_string = (
        f"mssql+pyodbc://{DB_USER}:{quote_plus(DB_PASSWORD)}"
        f"@{DB_SERVER}:{DB_PORT}/{DB_NAME}"
        f"?driver=ODBC+Driver+17+for+SQL+Server"
        f"&TrustServerCertificate=yes"
        f"&Encrypt=yes"
        f"&timeout={Config.DATABASE_TIMEOUT}"
    )
    
    SQLALCHEMY_DATABASE_URI = connection_string
    
    # Configuración adicional para producción
    LOG_LEVEL = 'WARNING'
    
    @classmethod
    def init_app(cls, app):
        Config.init_app(app)
        
        # Log de errores por email (opcional)
        import logging
        from logging.handlers import SMTPHandler
        
        if app.config.get('MAIL_SERVER'):
            auth = None
            if app.config.get('MAIL_USERNAME') and app.config.get('MAIL_PASSWORD'):
                auth = (app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD'])
            
            secure = None
            if app.config.get('MAIL_USE_TLS'):
                secure = ()
            
            mail_handler = SMTPHandler(
                mailhost=(app.config['MAIL_SERVER'], app.config.get('MAIL_PORT', 587)),
                fromaddr=app.config.get('MAIL_FROM', 'noreply@cierresmig.online'),
                toaddrs=app.config.get('ADMINS', ['admin@cierresmig.online']),
                subject='Error en Sistema de Webhooks',
                credentials=auth,
                secure=secure
            )
            
            mail_handler.setLevel(logging.ERROR)
            app.logger.addHandler(mail_handler)

class TestingConfig(Config):
    """Configuración para testing"""
    TESTING = True
    WTF_CSRF_ENABLED = False
    
    # Base de datos en memoria para tests
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'

# Mapeo de configuraciones
config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'testing': TestingConfig,
    'default': DevelopmentConfig
}