import ipaddress
import logging

from kalliope.core.NeuronModule import NeuronModule, MissingParameterException, InvalidParameterException
from wakeonlan import wol

logging.basicConfig()
logger = logging.getLogger("kalliope")


class Wake_on_lan(NeuronModule):
    def __init__(self, **kwargs):
        super(Wake_on_lan, self).__init__(**kwargs)

        self.mac_address = kwargs.get('mac_address', None)
        self.broadcast_address = kwargs.get('broadcast_address', '255.255.255.255')
        self.port = kwargs.get('port', 9)

        # check parameters
        if self._is_parameters_ok():
            # convert to unicode for testing
            broadcast_address_unicode = self.broadcast_address.decode('utf-8')
            # check the ip address is a valid one
            ipaddress.ip_address(broadcast_address_unicode)

            logger.debug("Call Wake_on_lan_neuron with parameters: mac_address: %s, broadcast_address: %s, port: %s"
                         % (self.mac_address, self.broadcast_address, self.port))

            # send the magic packet, the mac address format will be check by the lib
            wol.send_magic_packet(self.mac_address, ip_address=self.broadcast_address, port=self.port)

    def _is_parameters_ok(self):
        """
            Check if received parameters are ok to perform operations in the neuron
            :return: true if parameters are ok, raise an exception otherwise

            .. raises:: InvalidParameterException, MissingParameterException
        """
        # check we provide a mac address
        if self.mac_address is None:
            raise MissingParameterException("mac_address parameter required")
            # check the port
        if type(self.port) is not int:
            raise InvalidParameterException(
                "port argument must be an integer. Remove quotes in your configuration.")

        return True
