#!/usr/bin/env node
/**
 * Test-Script zum Prüfen, ob der WebSocket-Server lokal erreichbar ist
 * 
 * Verwendung:
 *   node scripts/testWebSocket.js
 *   node scripts/testWebSocket.js localhost 3050
 */

import http from 'http';

const host = process.argv[2] || 'localhost';
const port = process.argv[3] || '3050';
const url = `http://${host}:${port}`;

console.log(`🔌 Teste Socket.IO-Server auf ${url}...\n`);

// Test 1: HTTP-Polling (Socket.IO Handshake)
console.log('1️⃣ Teste HTTP-Polling (Socket.IO Handshake)...');
const pollingUrl = `${url}/socket.io/?EIO=4&transport=polling`;

const pollingReq = http.get(pollingUrl, (res) => {
  let data = '';
  
  res.on('data', (chunk) => {
    data += chunk;
  });
  
  res.on('end', () => {
    if (res.statusCode === 200) {
      console.log('   ✅ HTTP-Polling erfolgreich!');
      console.log(`   Status: ${res.statusCode}`);
      console.log(`   Response: ${data.substring(0, 200)}...`);
      
      // Versuche Session-ID zu extrahieren
      let sessionId = null;
      try {
        const jsonMatch = data.match(/\{.*\}/);
        if (jsonMatch) {
          const json = JSON.parse(jsonMatch[0]);
          if (json.sid) {
            sessionId = json.sid;
            console.log(`   Session ID: ${sessionId}`);
          }
        }
      } catch (e) {
        // Ignoriere JSON-Parse-Fehler
      }
      
      // Test 2: WebSocket-Upgrade
      console.log('\n2️⃣ Teste WebSocket-Upgrade...');
      testWebSocketUpgrade(host, port, sessionId);
    } else {
      console.error(`   ❌ HTTP-Polling fehlgeschlagen: Status ${res.statusCode}`);
      process.exit(1);
    }
  });
});

pollingReq.on('error', (error) => {
  console.error('   ❌ HTTP-Polling Fehler:');
  console.error(`   ${error.message}`);
  if (error.code === 'ECONNREFUSED') {
    console.error('   → Server läuft möglicherweise nicht oder ist nicht erreichbar');
    console.error(`   → Prüfe: netstat -tlnp | grep ${port}`);
  }
  process.exit(1);
});

pollingReq.setTimeout(5000, () => {
  pollingReq.destroy();
  console.error('   ❌ Timeout: Keine Antwort innerhalb von 5 Sekunden');
  process.exit(1);
});

function testWebSocketUpgrade(host, port, sessionId) {
  // WebSocket-Upgrade-Request
  // Sec-WebSocket-Key muss 16 Bytes (128 Bits) sein, base64-encoded
  const wsKey = Buffer.allocUnsafe(16);
  for (let i = 0; i < 16; i++) {
    wsKey[i] = Math.floor(Math.random() * 256);
  }
  const wsKeyBase64 = wsKey.toString('base64');
  const path = sessionId 
    ? `/socket.io/?EIO=4&transport=websocket&sid=${sessionId}`
    : '/socket.io/?EIO=4&transport=websocket';
  
  const options = {
    hostname: host,
    port: port,
    path: path,
    method: 'GET',
    headers: {
      'Upgrade': 'websocket',
      'Connection': 'Upgrade',
      'Sec-WebSocket-Key': wsKeyBase64,
      'Sec-WebSocket-Version': '13',
      'Sec-WebSocket-Protocol': 'chat, superchat'
    }
  };
  
  console.log(`   Request-Path: ${path}`);
  console.log(`   Sec-WebSocket-Key: ${wsKeyBase64.substring(0, 20)}...`);
  
  const wsReq = http.request(options, (res) => {
    console.log(`   Response Status: ${res.statusCode}`);
    console.log(`   Response Headers:`, JSON.stringify(res.headers, null, 2));
    
    if (res.statusCode === 101) {
      console.log('   ✅ WebSocket-Upgrade erfolgreich!');
      console.log(`   Status: ${res.statusCode} (Switching Protocols)`);
      console.log(`   Upgrade Header: ${res.headers.upgrade}`);
      console.log(`   Connection Header: ${res.headers.connection}`);
      console.log('\n✅ Socket.IO-Server ist erreichbar und unterstützt WebSockets!');
      process.exit(0);
    } else {
      console.log(`   ⚠️  WebSocket-Upgrade: Status ${res.statusCode} (erwartet: 101)`);
      console.log(`   → Server antwortet, aber Upgrade nicht erfolgreich`);
      
      // Lese Response-Body für weitere Informationen
      let body = '';
      res.on('data', (chunk) => {
        body += chunk;
      });
      res.on('end', () => {
        if (body) {
          console.log(`   Response Body: ${body.substring(0, 200)}`);
        }
        if (res.statusCode === 400) {
          console.log(`   → Socket.IO lehnt den Request ab (Bad Request)`);
          console.log(`   → Möglicherweise fehlt die Session-ID oder sie ist ungültig`);
        }
        process.exit(0);
      });
    }
  });
  
  wsReq.on('error', (error) => {
    console.error('   ❌ WebSocket-Upgrade Fehler:');
    console.error(`   ${error.message}`);
    console.error(`   Error Code: ${error.code}`);
    console.log('\n⚠️  HTTP-Polling funktioniert, aber WebSocket-Upgrade schlägt fehl.');
    process.exit(0);
  });
  
  wsReq.setTimeout(5000, () => {
    wsReq.destroy();
    console.error('   ❌ Timeout: Keine Antwort innerhalb von 5 Sekunden');
    console.error('   → Möglicherweise hängt der Server oder die Verbindung wird nicht akzeptiert');
    process.exit(1);
  });
  
  wsReq.end();
}

