import socket
import argparse
from datetime import datetime


def main():
    parser = argparse.ArgumentParser(
        description='Listen for Pharos UDP trigger events (e.g. start_timeline messages)',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog='''
Examples:
  %(prog)s -p 5000
  %(prog)s --port 5000 --bind 192.168.1.100
        '''
    )
    parser.add_argument('-p', '--port', type=int, required=True, help='UDP port to listen on')
    parser.add_argument('-b', '--bind', type=str, default='0.0.0.0', help='Address to bind to (default: 0.0.0.0)')
    args = parser.parse_args()

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((args.bind, args.port))
    sock.settimeout(1.0)

    print(f"Listening for UDP packets on {args.bind}:{args.port} (Ctrl+C to stop)\n")

    count = 0
    try:
        while True:
            try:
                data, addr = sock.recvfrom(1024)
                count += 1
                timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
                text = data.decode('ascii', errors='replace').rstrip('\r\n')
                print(f"{count:5} | {timestamp} | {addr[0]}:{addr[1]} | {text}")
            except socket.timeout:
                continue
    except KeyboardInterrupt:
        print(f"\nStopped. Received {count} packets.")
    finally:
        sock.close()


if __name__ == "__main__":
    main()
