#!/usr/bin/python3

# FUNCTIONALITY:
# 1) send "test emits" message to device manager
# 2) monitor emits; check that they meet defined behaviour


import zmq
from time import sleep
from threading import Thread
from ptcommon.ptdm_message import Message


def send_request(message_request_id, parameters):

    message = Message.from_parts(message_request_id, parameters)
    zmq_socket.send_string(message.to_string())

    response_string = zmq_socket.recv_string()
    response = Message.from_string(response_string)

    return response.message_id()


def request_test_emits():
    print("EXPECTED:")
    print("---------")

    print("                        PUB_DEVICE_ID_CHANGED 0")
    print("                        PUB_DEVICE_ID_CHANGED 1")
    print("                        PUB_DEVICE_ID_CHANGED 2")
    print("                        PUB_DEVICE_ID_CHANGED 3")
    print("                        PUB_BRIGHTNESS_CHANGED 3")
    print("                        PUB_BRIGHTNESS_CHANGED 6")
    print("                        PUB_BRIGHTNESS_CHANGED 10")
    print("                        PUB_PERIPHERAL_CONNECTED 1")
    print("                        PUB_PERIPHERAL_DISCONNECTED 1")
    print("                        PUB_BATTERY_CHARGING_STATE_CHANGED 1")
    print("                        PUB_BATTERY_CHARGING_STATE_CHANGED 0")
    print("                        PUB_BATTERY_CAPACITY_CHANGED 95")
    print("                        PUB_BATTERY_CAPACITY_CHANGED 50")
    print("                        PUB_BATTERY_TIME_REMAINING_CHANGED 300")
    print("                        PUB_BATTERY_TIME_REMAINING_CHANGED 250")
    print("                        PUB_SCREEN_BLANKED")
    print("                        PUB_SCREEN_UNBLANKED")
    print("                        PUB_SHUTDOWN_REQUESTED")
    print("                        PUB_REBOOT_REQUIRED")
    print("                        PUB_LOW_BATTERY_WARNING")
    print("                        PUB_CRITICAL_BATTERY_WARNING")

    print("")
    print(" ACTUAL: ")
    print("---------")

    send_request(Message.REQ_TEST_PUB_EMITS, [])


def listen_thread():

    print("Connecting to publish server...")
    zmq_context_listen = zmq.Context()
    zmq_socket = zmq_context_listen.socket(zmq.SUB)
    zmq_socket.setsockopt_string(zmq.SUBSCRIBE, "")
    zmq_socket.connect("tcp://127.0.0.1:3781")
    print("Connected to publish server")

    sleep(0.5)

    while continue_listening:
        poller = zmq.Poller()
        poller.register(zmq_socket, zmq.POLLIN)
        events = poller.poll(500)

        for i in range(len(events)):
            message_string = zmq_socket.recv_string()
            message = Message.from_string(message_string)
            print("Received publish event: " + message.message_friendly_string())


print("Starting thread...")

continue_listening = True
thread = Thread(target=listen_thread)
thread.start()


print("Connecting to request server...")
zmq_context_send = zmq.Context()
zmq_socket = zmq_context_send.socket(zmq.REQ)
zmq_socket.connect("tcp://127.0.0.1:3782")
print("Connected to request server.")


sleep(0.5)
request_test_emits()

print("*** End of tests ***")

print("Closing sockets...")
continue_listening = False
thread.join()
zmq_socket.close()
print("Done.")
