import './config/loadEnv.js'; // .env deterministisch laden

import http from 'http';
import https from 'https';
import fs from 'fs';
import app from './app.js';
import { setupWebSocket } from './utils/socket.js';
import { syncDatabase } from './utils/syncDatabase.js';

// HTTP-Server für API (Port 2020, intern, über Apache-Proxy)
const API_PORT = Number.parseInt(process.env.PORT || '2020', 10);
const httpServer = http.createServer(app);
// Socket.io wird nur auf HTTPS-Server bereitgestellt, nicht auf HTTP-Server
// setupWebSocket(httpServer); // Entfernt: Socket.io nur über HTTPS

// HTTPS-Server für Socket.io (Port 4443, direkt erreichbar)
let httpsServer = null;
const SOCKET_IO_PORT = Number.parseInt(process.env.SOCKET_IO_PORT || '4443', 10);
const USE_TLS = process.env.SOCKET_IO_TLS === '1';
const TLS_KEY_PATH = process.env.SOCKET_IO_TLS_KEY_PATH;
const TLS_CERT_PATH = process.env.SOCKET_IO_TLS_CERT_PATH;
const TLS_CA_PATH = process.env.SOCKET_IO_TLS_CA_PATH;

if (USE_TLS && TLS_KEY_PATH && TLS_CERT_PATH) {
  try {
    httpsServer = https.createServer({
      key: fs.readFileSync(TLS_KEY_PATH),
      cert: fs.readFileSync(TLS_CERT_PATH),
      ca: TLS_CA_PATH ? fs.readFileSync(TLS_CA_PATH) : undefined,
    }, app);
    setupWebSocket(httpsServer);
    console.log(`[Socket.io] HTTPS-Server für Socket.io konfiguriert auf Port ${SOCKET_IO_PORT}`);
  } catch (err) {
    console.error('[Socket.io] Fehler beim Laden der TLS-Zertifikate:', err.message);
    console.error('[Socket.io] Socket.io wird nicht verfügbar sein');
  }
} else {
  console.warn('[Socket.io] TLS nicht konfiguriert - Socket.io wird nicht verfügbar sein');
}

syncDatabase().then(() => {
  // API-Server auf Port 2020 (intern, nur localhost)
  httpServer.listen(API_PORT, '127.0.0.1', () => { 
    console.log(`[API] HTTP-Server läuft auf localhost:${API_PORT} (intern, über Apache-Proxy)`);
  });
  
  // Socket.io-Server auf Port 4443 (extern, direkt erreichbar)
  if (httpsServer) {
    httpsServer.listen(SOCKET_IO_PORT, '0.0.0.0', () => {
      console.log(`[Socket.io] HTTPS-Server läuft auf Port ${SOCKET_IO_PORT} (direkt erreichbar)`);
    });
  }
}).catch(err => {
  console.error('Failed to sync database:', err);
  process.exit(1); 
});
