#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Syslog server to receive and display syslog messages from MiniDexed.
"""

import socket
import time
import threading

class SyslogServer:
    def __init__(self, host='0.0.0.0', port=8514):
        self.host = host
        self.port = port
        self.server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.server.bind((self.host, self.port))
        self.start_time = None
        self.running = True

    def start(self):
        ip_address = socket.gethostbyname(socket.gethostname())
        print(f"Syslog server listening on {ip_address}:{self.port}")
        input_thread = threading.Thread(target=self.wait_for_input)
        input_thread.daemon = True
        input_thread.start()
        while self.running:
            try:
                data, address = self.server.recvfrom(1024)
                self.handle_message(data)
            except KeyboardInterrupt:
                self.running = False

    def handle_message(self, data):
        message = data[2:].decode('utf-8').strip()

        if self.start_time is None:
            self.start_time = time.time()
            relative_time = "0:00:00.000"
        else:
            elapsed_time = time.time() - self.start_time
            hours = int(elapsed_time // 3600)
            minutes = int((elapsed_time % 3600) // 60)
            seconds = int(elapsed_time % 60)
            milliseconds = int((elapsed_time % 1) * 1000)
            relative_time = f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}"

        print(f"{relative_time} {message}")

    def wait_for_input(self):
        input("Press any key to exit...")
        self.running = False

if __name__ == "__main__":
    server = SyslogServer()
    server.start()
    print("Syslog server stopped.")