# Fichier: config.py (VERSION POSTGRESQL READY)
import os
from datetime import timedelta
from dotenv import load_dotenv

load_dotenv()

class Config:
    # ========================================================================
    # ENVIRONNEMENT
    # ========================================================================
    FLASK_ENV = os.environ.get('FLASK_ENV', 'development')
    
    # ========================================================================
    # SECRET_KEY (CRITIQUE)
    # ========================================================================
    SECRET_KEY_RAW = os.environ.get('SECRET_KEY')
    
    if not SECRET_KEY_RAW:
        if FLASK_ENV == 'production':
            raise ValueError(
                "⚠️  ERREUR CRITIQUE : SECRET_KEY manquante en production !"
            )
        else:
            SECRET_KEY_RAW = 'dev-key-insecure-change-me-minimum-32-characters'
            print("⚠️  AVERTISSEMENT : Utilisation d'une SECRET_KEY par défaut (Mode DEV uniquement)")
    
    SECRET_KEY = str(SECRET_KEY_RAW)
    
    # Validation longueur
    if len(SECRET_KEY) < 32:
        if FLASK_ENV == 'production':
            raise ValueError("⚠️ SECRET_KEY trop courte (min 32 chars en production)")
        else:
            print("⚠️ SECRET_KEY faible détectée (dev uniquement)")
    
    # ========================================================================
    # BASE DE DONNÉES - PostgreSQL
    # ========================================================================
    DATABASE_URL = os.environ.get('DATABASE_URL')
    
    # FIX POUR HEROKU/RENDER (postgres:// -> postgresql://)
    if DATABASE_URL and DATABASE_URL.startswith("postgres://"):
        DATABASE_URL = DATABASE_URL.replace("postgres://", "postgresql://", 1)
    
    # Validation production
    if FLASK_ENV == 'production':
        if not DATABASE_URL:
            raise ValueError("⚠️  ERREUR : DATABASE_URL manquante en production !")
        if 'sqlite' in DATABASE_URL.lower():
            raise ValueError("⚠️  ERREUR : SQLite interdit en production ! Utilisez PostgreSQL.")
    
    # URI par défaut - PostgreSQL (remplace SQLite)
    SQLALCHEMY_DATABASE_URI = DATABASE_URL or \
        'postgresql://mcyber_user:test123@localhost/mcyber_dev'
    
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    # Options pool de connexions PostgreSQL
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_pre_ping': True,      # Vérifier connexion avant utilisation
        'pool_recycle': 3600,        # Recycler après 1h
        'pool_size': 10,             # Connexions dans le pool
        'max_overflow': 20,          # Connexions supplémentaires
        'pool_timeout': 30,          # Timeout pour obtenir connexion
    }
    
    # ========================================================================
    # CONFIGURATION EMAIL
    # ========================================================================
    MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp-relay.sendinblue.com')
    MAIL_PORT = int(os.environ.get('MAIL_PORT', 587))
    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'True').lower() in ('true', '1', 't')
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    MAIL_DEFAULT_SENDER = os.environ.get('MAIL_DEFAULT_SENDER', 'MCyber Audit <noreply@mcyber.fr>')
    
    if FLASK_ENV == 'production' and (not MAIL_USERNAME or not MAIL_PASSWORD):
        print("⚠️  AVERTISSEMENT : Identifiants mail manquants. L'envoi échouera.")
    
    # ========================================================================
    # COMPTE ADMIN
    # ========================================================================
    ADMIN_EMAIL = os.environ.get('ADMIN_EMAIL')
    ADMIN_PASSWORD = os.environ.get('ADMIN_PASSWORD')
    
    if FLASK_ENV == 'production' and (not ADMIN_EMAIL or not ADMIN_PASSWORD):
         raise ValueError("⚠️  ERREUR : ADMIN_EMAIL et ADMIN_PASSWORD requis en production.")
    
    if not ADMIN_EMAIL: 
        ADMIN_EMAIL = 'admin@dev.local'
    if not ADMIN_PASSWORD: 
        ADMIN_PASSWORD = 'DevPassword123!'

    # ========================================================================
    # SÉCURITÉ
    # ========================================================================
    WTF_CSRF_ENABLED = True
    WTF_CSRF_TIME_LIMIT = 3600
    WTF_CSRF_SSL_STRICT = (FLASK_ENV == 'production')
    
    SESSION_COOKIE_SECURE = (FLASK_ENV == 'production')
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SAMESITE = 'Lax'
    PERMANENT_SESSION_LIFETIME = timedelta(hours=2)
    
    # ========================================================================
    # RATE LIMITING & UPLOADS
    # ========================================================================
    RATELIMIT_ENABLED = True
    RATELIMIT_STORAGE_URL = os.environ.get('REDIS_URL', 'memory://')
    RATELIMIT_DEFAULT = "200 per hour"
    
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024
    ALLOWED_EXTENSIONS = {'pdf', 'png', 'jpg', 'jpeg'}


class ProductionConfig(Config):
    """Configuration production - Sécurité maximale"""
    DEBUG = False
    TESTING = False
    PREFERRED_URL_SCHEME = 'https'
    SESSION_COOKIE_SECURE = True
    WTF_CSRF_SSL_STRICT = True


class DevelopmentConfig(Config):
    """Configuration développement"""
    DEBUG = True
    TESTING = False
    SESSION_COOKIE_SECURE = False
    PREFERRED_URL_SCHEME = 'http'