# -*- 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.')