#! /usr/bin/python3
# pt-devices: show hardware detected and enabled by pt-device-manager
# Initial implementation by @rricharz 2017
# Modifications by CEED Ltd 2018

import zmq
from ptcommon.ptdm_message import Message
from ptcommon.common_ids import DeviceID
from ptcommon.common_ids import HostDevice
from ptcommon.common_ids import Peripheral
from ptcommon.common_ids import PeripheralID
import platform

zmq_socket = None


def main():
    try:
        print("Devices and peripherals handled by pt-device-manager:")
        print("OS release: " + platform.release())
        connect_to_socket()
        message = get_host_device_id()
        print_device_id(message)
        for id in range(6):
            message = get_peripheral_enabled(id)
            print_peripheral_enabled(message, id)
        cleanup()

    except Exception as e:
        print("Unable to get information from pt-device-manager: " + str(e))

    finally:
        cleanup()


def connect_to_socket():
    global zmq_socket

    zmq_context_send = zmq.Context()
    zmq_socket = zmq_context_send.socket(zmq.REQ)
    zmq_socket.sndtimeo = 1000
    zmq_socket.rcvtimeo = 1000
    zmq_socket.connect("tcp://127.0.0.1:3782")


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()
    return Message.from_string(response_string)


def get_host_device_id():
    message = Message.from_parts(Message.REQ_GET_DEVICE_ID, [])
    zmq_socket.send_string(message.to_string())

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


def get_peripheral_enabled(id):
    message = Message.from_parts(Message.REQ_GET_PERIPHERAL_ENABLED, [id])
    zmq_socket.send_string(message.to_string())

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


def print_device_id(message):
    if message.message_id() == Message.RSP_GET_DEVICE_ID:
        if message.validate_parameters([int]):
            device = HostDevice(id=int(message.parameters()[0]))
            if device.id != DeviceID.unknown:
                print("Host device is " + str(device.name))
            else:
                print("Unknown host device")
        else:
            print("Unable to get valid device ID.")


def print_peripheral_enabled(message, id):
    if message.message_id() == Message.RSP_GET_PERIPHERAL_ENABLED:
        if message.validate_parameters([int]):
            p_enabled = message.parameters()

            if p_enabled[0] == '1':
                peripheral = Peripheral(id=id)
                if peripheral.id != PeripheralID.unknown:
                    print("Peripheral " + peripheral.name + " is currently enabled")
        else:
            print("Unable to get valid peripheral enabled.")


def cleanup():
    if (zmq_socket is not None):
        zmq_socket.close(0)


if __name__ == "__main__":
    main()