# -*- coding: utf-8 -*-
# SPDX-FileCopyrightText: 2014-2023 Institute for Automation of Complex Power Systems, RWTH Aachen University
# SPDX-License-Identifier: Apache-2.0

import villas_pb2
import time, socket, errno, sys, os, signal

layer = sys.argv[1] if len(sys.argv) == 2 else "udp"

if layer not in ["udp", "unix"]:
    raise Exception("Unsupported socket type")

if layer == "unix":
    local = "/var/run/villas-node.client.sock"
    remote = "/var/run/villas-node.server.sock"

    skt = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)

    # Delete stale sockets
    if os.path.exists(local):
        os.unlink(local)
elif layer == "udp":
    local = ("0.0.0.0", 12001)
    remote = ("127.0.0.1", 12000)

    skt = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

print("Start client...")

skt.bind(local)

# Try to connect in case Unix domain socket does not exist yet..
connected = False
while not connected:
    try:
        skt.connect(remote)
    except socket.error as serr:
        if serr.errno not in [errno.ECONNREFUSED, errno.ENOENT]:
            raise serr

        print("Not connected. Retrying in 1 sec")
        time.sleep(1)
    else:
        connected = True

print("Ready. Ctrl-C to quit.")

msg = villas_pb2.Message()


# Gracefully shutdown
def sighandler(signum, frame):
    running = False


signal.signal(signal.SIGINT, sighandler)
signal.signal(signal.SIGTERM, sighandler)

running = True

while running:
    dgram = skt.recv(1024)
    if not dgram:
        break
    else:
        msg.ParseFromString(dgram)
        print(msg)

        skt.send(msg.SerializeToString())

skt.close()

print("Bye.")
