# Legge variabili da .env
# Definisce config per development/production
# Niente credenziali reali, solo template
"""
ENIGMA Inventario - Application Configuration
Gestisce variabili di ambiente e configurazioni per dev/prod
"""

import os
from datetime import timedelta
from dotenv import load_dotenv

# Carica variabili da .env
load_dotenv()


class Config:
    """Configurazioni base - condivise tra ambienti"""

    # === FLASK ===
    FLASK_ENV = os.getenv("FLASK_ENV", "production")
    SECRET_KEY = os.getenv("SECRET_KEY", "EnigmaProject-ChangeInProduction")
    DEBUG = False
    TESTING = False

    # Sessione Flask (per salvare token Cassanova)
    SESSION_TYPE = 'filesystem'
    SESSION_PERMANENT = False
    PERMANENT_SESSION_LIFETIME = timedelta(hours=24)

    # === DATABASE ===
    DB_HOST = os.getenv("DB_HOST", "localhost")
    DB_PORT = int(os.getenv("DB_PORT", 3306))
    DB_USER = os.getenv("DB_USER", "enigma_user")
    DB_PASSWORD = os.getenv("DB_PASSWORD", "")
    DB_NAME = os.getenv("DB_NAME", "enigma")
    DB_CHARSET = os.getenv("DB_CHARSET", "utf8mb4")

    # Costruisci connection string
    SQLALCHEMY_DATABASE_URI = (
        f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
        f"?charset={DB_CHARSET}"
    )

    # === JWT ===
    JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY", "EnigmaProject")
    JWT_ALGORITHM = os.getenv("JWT_ALGORITHM", "HS256")
    JWT_EXPIRATION_HOURS = int(os.getenv("JWT_EXPIRATION_HOURS", 24))
    JWT_REFRESH_EXPIRATION_DAYS = int(os.getenv("JWT_REFRESH_EXPIRATION_DAYS", 7))

    # === CASSANOVA API ===
    CASSANOVA_HOSTNAME = os.getenv(
        "CASSANOVA_HOSTNAME", "https://api.cassanova.com"
    )
    CASSANOVA_API_KEY = os.getenv("CASSANOVA_API_KEY", "")
    CASSANOVA_CACHE_TTL_HOURS = int(os.getenv("CASSANOVA_CACHE_TTL_HOURS", 24))

    # === SERVER ===
    SERVER_HOST = os.getenv("SERVER_HOST", "enigma.pooltech.it")
    SERVER_PORT = int(os.getenv("SERVER_PORT", 5000))
    SERVER_WORKERS = int(os.getenv("SERVER_WORKERS", 4))
    SERVER_LOG_LEVEL = os.getenv("SERVER_LOG_LEVEL", "INFO")

    # === FEATURES ===
    BARCODE_SCANNER_TYPE = os.getenv("BARCODE_SCANNER_TYPE", "mobile")
    ENABLE_MULTI_USER_SESSION = os.getenv("ENABLE_MULTI_USER_SESSION", "true").lower() == "true"
    ENABLE_EXPORT_CSV = os.getenv("ENABLE_EXPORT_CSV", "true").lower() == "true"
    ENABLE_EXPORT_EXCEL = os.getenv("ENABLE_EXPORT_EXCEL", "false").lower() == "true"

    # === SECURITY ===
    CORS_ALLOWED_ORIGINS = os.getenv("CORS_ALLOWED_ORIGINS", "https://enigma.pooltech.it")
    SESSION_SECURE_COOKIE = os.getenv("SESSION_SECURE_COOKIE", "true").lower() == "true"
    SESSION_HTTPONLY = os.getenv("SESSION_HTTPONLY", "true").lower() == "true"
    SESSION_SAMESITE = os.getenv("SESSION_SAMESITE", "Lax")

    # === SMTP (Future Feature) ===
    SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.pooltech.it")
    SMTP_PORT = int(os.getenv("SMTP_PORT", 25))
    SMTP_USER = os.getenv("SMTP_USER", "")
    SMTP_PASSWORD = os.getenv("SMTP_PASSWORD", "")
    SMTP_FROM = os.getenv("SMTP_FROM", "noreply@pooltech.it")
    ADMIN_EMAIL = os.getenv("ADMIN_EMAIL", "admin@pooltech.it")

    # === LOGGING ===
    LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
    LOG_FILE = os.getenv("LOG_FILE", "/var/log/enigma_inventario/app.log")
    LOG_MAX_BYTES = int(os.getenv("LOG_MAX_BYTES", 10485760))  # 10MB
    LOG_BACKUP_COUNT = int(os.getenv("LOG_BACKUP_COUNT", 10))

    # === THEME ===
    THEME_PRIMARY_COLOR = os.getenv("THEME_PRIMARY_COLOR", "#1e3a5f")
    THEME_ACCENT_COLOR = os.getenv("THEME_ACCENT_COLOR", "#ff8c42")
    THEME_LOGO_TEXT = os.getenv("THEME_LOGO_TEXT", "enigma project")


class DevelopmentConfig(Config):
    """Configurazioni per development"""

    FLASK_ENV = "development"
    DEBUG = True
    TESTING = False
    SESSION_SECURE_COOKIE = False  # In dev, non servono cookies sicuri


class TestingConfig(Config):
    """Configurazioni per testing"""

    TESTING = True
    DEBUG = True
    # Usa un DB di test separato
    DB_NAME = "enigma_test"


class ProductionConfig(Config):
    """Configurazioni per production - più rigide"""

    FLASK_ENV = "production"
    DEBUG = False
    TESTING = False
    SESSION_SECURE_COOKIE = True  # ALWAYS in production
    SESSION_SAMESITE = "Strict"   # Più strict in production


# Mappa per selezionare config in base a FLASK_ENV
config_by_env = {
    "development": DevelopmentConfig,
    "testing": TestingConfig,
    "production": ProductionConfig,
}


def get_config():
    """
    Ritorna la giusta classe Config basata su FLASK_ENV
    """
    env = os.getenv("FLASK_ENV", "production")
    return config_by_env.get(env, ProductionConfig)

