import socket
import sys
import time
from datetime import datetime

# ==================== XML ANFRAGE ====================
xml = '''<?xml version="1.0" encoding="utf-8"?>
<package>
<header>
<name>LockerELSNETFree</name>
<version>1.0</version>
</header>
<parameters>
<id>2248362</id>
</parameters>
<userdata>xyz</userdata>
</package>'''

frame = chr(2) + xml + chr(3)

host = '192.168.16.100'
port = 6771

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(15)   # Gesamt-Timeout

print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Verbinde mit Metra...")

try:
    sock.connect((host, port))
    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Verbunden. Sende Buchung...")
    sock.sendall(frame.encode('utf-8'))

    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Warte auf Antwort...")

    response = b''
    start_time = time.time()

    while True:
        data = sock.recv(4096)
        if not data:
            break
        response += data
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Chunk erhalten ({len(data)} Bytes)")

        # Wenn wir das Ende des XMLs erkennen, können wir früher abbrechen
        if b'</package>' in response:
            print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Vollständige Antwort empfangen.")
            break

        if time.time() - start_time > 20:   # max 20 Sekunden warten
            print("Timeout erreicht.")
            break

except Exception as e:
    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Fehler: {e}")
    sock.close()
    sys.exit(1)

sock.close()

# Antwort bereinigen
response_str = response.decode('utf-8', errors='ignore').strip()
if response_str.startswith(chr(2)):
    response_str = response_str[1:]
if response_str.endswith(chr(3)):
    response_str = response_str[:-1]

print(f"\n[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Finale Antwort von Metra:\n")
print(response_str)
