import compLib.CompLib_pb2 as CompLib_pb2
from compLib.CompLibClient import CompLibClient

MOTOR_COUNT = 4


class Motor(object):
    """Class used to control the motors
    """

    @staticmethod
    def power(port: int, percent: float):
        """Set specified motor to percentage power

        :param port: Port, which the motor is connected to. 0-3
        :param percent: Percentage of max speed. between -100 and 100
        :raises: IndexError
        """

        if port < 0 or port >= MOTOR_COUNT:
            raise IndexError("Invalid Motor port specified!")

        if percent < -100 or percent > 100:
            raise IndexError("Invalid Motor speed specified! Speed is between -100 and 100 percent!")

        request = CompLib_pb2.MotorsSetPowerRequest()
        request.header.message_type = request.DESCRIPTOR.full_name
        request.port = port
        request.power = percent

        CompLibClient.send(request.SerializeToString(), request.ByteSize())

    @staticmethod
    def speed(port: int, speed: float):
        """Set specified motor to percentage power

        :param port: Port, which the motor is connected to. 0-3
        :param speed: Speed at which a motor should turn in RPM
        :raises: IndexError
        """

        if port < 0 or port >= MOTOR_COUNT:
            raise IndexError("Invalid Motor port specified!")

        request = CompLib_pb2.MotorsSetSpeedRequest()
        request.header.message_type = request.DESCRIPTOR.full_name
        request.port = port
        request.speed = speed

        CompLibClient.send(request.SerializeToString(), request.ByteSize())

    # @staticmethod
    # def all_off():
    #     """
    #     Turns of all motors
    #     """
    #     Logging.get_logger().debug(f"Motor.all_off")
    #
    #     for i in range(1, MOTOR_COUNT + 1):
    #         Motor.active_break(i)

    # @staticmethod
    # def active_break(port: int):
    #     """
    #     Actively break with a specific motor
    #
    #     :param port: Port, which the motor is connected to. 1-4
    #     """
    #     Motor.pwm(port, 0, MotorMode.BREAK)
