# -*- coding: utf-8 -*-

from ....Methods.Machine import MachineCheckError


def check(self):
    """Check that the Machine object is correct

    Parameters
    ----------
    self :
        A Machine object

    Returns
    -------
    None

    Raises
    _______
    MC_AbstractError
        Machine is an abstract class
    MC_StatorNotStator
        self.stator.is_stator must be True
    MC_RotorIsStator
        self.rotor.is_stator must be False
    MC_BothInternal
        self.rotor.is_internal and self.rotor.is_internal can't be both True
    MC_BothExternal
        self.rotor.is_internal and self.rotor.is_internal can't be both False
    MC_RotorDontFit
        The Rotor is too big to fit in the Stator
    MC_ShaftTooBig
        The Shaft is too big to fit in the Rotor
    MC_ShaftTooSmall
        The Shaft is too small to fit in the Rotor
    MC_MecAirgapError
        The Stator and the rotor don't fit because of magnet or short circuit ring
    """

    if type(self).__name__ == "Machine":
        raise MC_AbstractError("Machine is an abstract class")

    if not self.stator.is_stator:
        raise MC_StatorNotStator("self.stator.is_stator must be True")

    if self.rotor.is_stator:
        raise MC_RotorIsStator("self.rotor.is_stator must be False")

    if self.rotor.is_internal and self.stator.is_internal:
        raise MC_BothInternal(
            "self.rotor.is_internal and " "self.rotor.is_internal can't be both True"
        )

    if (not self.rotor.is_internal) and (not self.stator.is_internal):
        raise MC_BothExternal(
            "self.rotor.is_internal and " "self.rotor.is_internal can't be both False"
        )

    if self.rotor.is_internal:
        if self.rotor.Rext > self.stator.Rint:
            raise MC_RotorDontFit("The Rotor is too big to fit in the Stator")
        if self.shaft.Drsh / 2.0 > self.rotor.Rint:
            raise MC_ShaftTooBig("The Shaft is too big to fit in the Rotor")
        if self.shaft.Drsh / 2.0 < self.rotor.Rint:
            raise MC_ShaftTooSmall("The Shaft is too small to fit in the " "Rotor")
    else:
        if self.stator.Rext > self.rotor.Rint:
            raise MC_StatorDontFit("The Stator is too big to fit in the Rotor")

    if self.comp_width_airgap_mec() <= 0:
        raise MC_MecAirgapError(
            "The Stator and the rotor don't fit because "
            "of magnet or short circuit ring"
        )

    self.rotor.check()
    self.stator.check()


class MC_AbstractError(MachineCheckError):
    """ """

    pass


class MC_StatorNotStator(MachineCheckError):
    """ """

    pass


class MC_RotorIsStator(MachineCheckError):
    """ """

    pass


class MC_BothInternal(MachineCheckError):
    """ """

    pass


class MC_BothExternal(MachineCheckError):
    """ """

    pass


class MC_RotorDontFit(MachineCheckError):
    """

    Parameters
    ----------

    Returns
    -------

    Raises
    ------
    stator


    """

    pass


class MC_StatorDontFit(MachineCheckError):
    """

    Parameters
    ----------

    Returns
    -------

    Raises
    ------
    rotor


    """

    pass


class MC_ShaftTooBig(MachineCheckError):
    """

    Parameters
    ----------

    Returns
    -------

    Raises
    ------
    rotor


    """

    pass


class MC_ShaftTooSmall(MachineCheckError):
    """

    Parameters
    ----------

    Returns
    -------

    Raises
    ------
    rotor


    """

    pass


class MC_MecAirgapError(MachineCheckError):
    """ """

    pass
