#!/usr/bin/env python3
"""
Production-Startskript für Mercedes-Benz TBA Marienfelde
MYP (Mercedes-Benz Your Printer) System - Air-Gapped Production Environment

Dieses Skript startet das System im Production-Modus mit allen
erforderlichen Sicherheits- und Performance-Optimierungen.

Verfügbare Modi:
    - production: Mercedes-Benz TBA Air-Gapped (optimiert + sicher)
    - development: Lokale Entwicklung (debug + flexibel)

Verwendung:
    python start_production.py
    
Umgebungsvariablen:
    FLASK_ENV=production
    USE_PRODUCTION_CONFIG=true
    MERCEDES_ENVIRONMENT=production
    AIR_GAPPED_MODE=true
"""

import os
import sys
import logging
from datetime import datetime

# Production-Environment setzen
os.environ['FLASK_ENV'] = 'production'
os.environ['USE_PRODUCTION_CONFIG'] = 'true'
os.environ['MERCEDES_ENVIRONMENT'] = 'production'
os.environ['AIR_GAPPED_MODE'] = 'true'

# SSL für Production
os.environ['FLASK_SSL_REQUIRED'] = 'true'

# Logging-Level
os.environ['LOG_LEVEL'] = 'INFO'

# Performance-Optimierungen
os.environ['PYTHONOPTIMIZE'] = '1'
os.environ['PYTHONDONTWRITEBYTECODE'] = '1'

def print_production_banner():
    """Zeigt den Production-Start-Banner"""
    banner = f"""
{'='*80}
🏢 MERCEDES-BENZ TBA MARIENFELDE - MYP PRODUCTION SYSTEM
{'='*80}

🚀 Environment:     Production Air-Gapped
🔒 Security:        Maximum (SSL + Security Headers + CSRF)
🌐 Network:         Air-Gapped (Offline-Mode)
⚡ Performance:     Fully Optimized (Cache + Minified Assets)
📊 Monitoring:      Production-Grade Health Checks
🔍 Audit-Logging:   Mercedes-Benz Compliance Mode
🎯 Modi:            Nur Production + Development (konsolidiert)
📅 Start-Zeit:      {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}

{'='*80}
"""
    print(banner)

def check_production_requirements():
    """Prüft Production-Voraussetzungen"""
    print("🔍 Prüfe Production-Voraussetzungen...")
    
    requirements = []
    
    # Python-Version prüfen
    if sys.version_info < (3, 8):
        requirements.append("❌ Python 3.8+ erforderlich")
    else:
        requirements.append("✅ Python-Version OK")
    
    # Erforderliche Dateien prüfen
    required_files = [
        'app.py',
        'models.py',
        'utils/settings.py',
        'requirements.txt'
    ]
    
    for file in required_files:
        if os.path.exists(file):
            requirements.append(f"✅ {file}")
        else:
            requirements.append(f"❌ {file} fehlt")
    
    # Konsolidierte Modi-Konfiguration prüfen
    try:
        from app import ProductionConfig, DevelopmentConfig
        requirements.append("✅ Konsolidierte Modi-Konfiguration verfügbar")
        requirements.append(f"  • ProductionConfig: Optimiert + Sicher")
        requirements.append(f"  • DevelopmentConfig: Debug + Flexibel")
    except ImportError as e:
        requirements.append(f"❌ Modi-Konfiguration fehlt: {e}")
    
    # SSL-Zertifikate prüfen (optional)
    ssl_files = [
        'ssl/server.crt',
        'ssl/server.key',
        'certs/mercedes/cert.pem'
    ]
    
    ssl_available = any(os.path.exists(f) for f in ssl_files)
    if ssl_available:
        requirements.append("✅ SSL-Zertifikate verfügbar")
    else:
        requirements.append("⚠️ SSL-Zertifikate nicht gefunden (HTTP-Mode)")
    
    # Datenbank-Verzeichnis prüfen
    if os.path.exists('instance'):
        requirements.append("✅ Datenbank-Verzeichnis")
    else:
        requirements.append("❌ Instance-Verzeichnis fehlt")
        os.makedirs('instance', exist_ok=True)
        requirements.append("✅ Instance-Verzeichnis erstellt")
    
    for req in requirements:
        print(f"   {req}")
    
    # Kritische Fehler prüfen
    critical_errors = [r for r in requirements if r.startswith("❌")]
    if critical_errors:
        print("\n❌ KRITISCHE FEHLER GEFUNDEN:")
        for error in critical_errors:
            print(f"   {error}")
        print("\n🛑 Production-Start abgebrochen!")
        sys.exit(1)
    
    print("✅ Alle Voraussetzungen erfüllt\n")

def set_production_optimizations():
    """Setzt Production-Optimierungen"""
    print("⚡ Aktiviere Production-Optimierungen...")
    
    # Memory-Optimierungen
    os.environ['MALLOC_TRIM_THRESHOLD'] = '100000'
    
    # Flask-Optimierungen
    os.environ['FLASK_SKIP_DOTENV'] = '1'
    
    # SQLite-Optimierungen für Air-Gapped
    os.environ['SQLITE_SYNCHRONOUS'] = 'NORMAL'
    os.environ['SQLITE_CACHE_SIZE'] = '10000'
    
    # Asset-Optimierungen (konsolidiert)
    os.environ['USE_MINIFIED_ASSETS'] = 'true'
    os.environ['DISABLE_ANIMATIONS'] = 'true'
    os.environ['LIMIT_GLASSMORPHISM'] = 'true'
    
    print("   ✅ Memory-Optimierungen aktiviert")
    print("   ✅ Flask-Optimierungen aktiviert") 
    print("   ✅ Datenbank-Optimierungen aktiviert")
    print("   ✅ Asset-Optimierungen aktiviert (konsolidiert)")
    print()

def setup_security():
    """Konfiguriert Production-Sicherheit"""
    print("🔒 Konfiguriere Production-Sicherheit...")
    
    # Security Headers
    os.environ['FORCE_HTTPS'] = 'true'
    os.environ['HSTS_MAX_AGE'] = '31536000'
    
    # Session-Sicherheit
    os.environ['SESSION_SECURE'] = 'true'
    os.environ['SESSION_HTTPONLY'] = 'true'
    os.environ['SESSION_SAMESITE'] = 'Strict'
    
    # CSRF-Schutz
    os.environ['CSRF_TIME_LIMIT'] = '3600'
    
    # Mercedes-Benz Compliance
    os.environ['COMPLIANCE_MODE'] = 'true'
    os.environ['AUDIT_LOGGING'] = 'true'
    
    print("   ✅ Security Headers konfiguriert")
    print("   ✅ Session-Sicherheit aktiviert")
    print("   ✅ CSRF-Schutz aktiviert")
    print("   ✅ Mercedes-Benz Compliance aktiviert")
    print()

def start_application():
    """Startet die Hauptanwendung"""
    print("🚀 Starte MYP Production System (Konsolidierte Modi)...\n")
    
    try:
        # app.py importieren und starten
        from app import main
        main()
        
    except KeyboardInterrupt:
        print("\n🛑 Production-System durch Benutzer gestoppt")
    except Exception as e:
        print(f"\n❌ KRITISCHER FEHLER: {str(e)}")
        sys.exit(1)

def main():
    """Haupt-Production-Start-Funktion"""
    # Banner anzeigen
    print_production_banner()
    
    # Voraussetzungen prüfen
    check_production_requirements()
    
    # Optimierungen setzen
    set_production_optimizations()
    
    # Sicherheit konfigurieren
    setup_security()
    
    # Anwendung starten
    start_application()

if __name__ == "__main__":
    main() 