"""
This class keeps track of all the motors, sensors and import variables needed for the robot.
"""
class Registry:
    """
    Standard kwargs to give for this function

    data = {
        # Motors (all units are in degrees)
        'left_hip_pitch': 0,
        'left_hip_yaw': 0,
        'left_hip_roll': 0,
        'left_knee_pitch': 0,
        'left_ankle_pitch': 0,
        'left_ankle_yaw': 0,
        'left_ankle_roll': 0,
        'right_hip_pitch': 0,
        'right_hip_yaw': 0,
        'right_hip_roll': 0,
        'right_knee_pitch': 0,
        'right_ankle_pitch': 0,
        'right_ankle_yaw': 0,
        'right_ankle_roll': 0,
        'left_shoulder_pitch': 0,
        'left_shoulder_yaw': 0,
        'left_shoulder_roll': 0,
        'left_elbow_pitch': 0,
        'right_shoulder_pit  ch': 0,
        'right_shoulder_yaw': 0,
        'right_shoulder_roll': 0,
        'right_elbow_pitch': 0,
        'torso_pitch': 0,
        'torso_yaw': 0,
        'torso_roll': 0,
        'neck_pitch': 0,
        'neck_yaw': 0,
        'neck_roll': 0,

        # Sensors
        # Add later
    }

    This will also have the constants
    """
    def __init__(self, **kwargs):
        self.data = {
            # Add defualt later
        }
        self.constants = {
            # Add some constants here later
        }
        for key, value in kwargs.items():
            self.data[str(key)] = value

    def update(self, partsAndValues):
        """
        This function updates the dictionary

        arg artsAndValues is {string --> int or float}

        Error codes:
        1 is success
        -1 is the error for NoneType variables
        -2 is for incorrect datatypes
        -3 is for when the key is not in the dictionary
        """

        if partsAndValues == None:
            return -1

        if type(partsAndValues) != dict:
            return -2

        for key in partsAndValues.keys():
            if key in self.data:
                self.data[str(key)] = partsAndValues[key]
            else:
                return -3
            return 1

    def add(self, partsAndValues):
        """
        This function will add a part to the system if needed

        arg artsAndValues is {string --> int or float}

        Error codes:
        1 is success
        -1 is the error for NoneType variables
        -2 is for incorrect datatypes
        -3 is for when the key is in the dictionary
        """

        if partsAndValues == None:
            return -1

        if type(partsAndValues) != dict:
            return -2

        for key in partsAndValues.keys():
            if key in self.data:
                return -3
            else:
                self.data[str(key)] = partsAndValues[key]
            return 1

    def remove(self, partsAndValues):
        """
        This function will remove a part to the system if needed

        arg artsAndValues is [string]

        Error codes:
        1 is success
        -1 is the error for NoneType variables
        -2 is for incorrect datatypes
        -3 is for when the key is not in the dictionary
        """

        if partsAndValues == None:
            return -1
            

        if type(partsAndValues) != list:
            return -2

        for key in partsAndValues:
            if key in self.data:
                self.data.pop(str(key))
            else:
                return -3
            return 1
        

# # Test
# stuff = Propioception(
#         left_hip_pitch= 0,
#         left_hip_yaw= 0,
#         left_hip_roll= 0,
#         left_knee_pitch= 0,
#         left_ankle_pitch= 0,
#         left_ankle_yaw= 0,
#         left_ankle_roll= 0,
#         right_hip_pitch= 0,
#         right_hip_yaw= 0,
#         right_hip_roll= 0,
#         right_knee_pitch= 0,
#         right_ankle_pitch= 0,
#         right_ankle_yaw= 0,
#         right_ankle_roll= 0,
#         left_shoulder_pitch= 0,
#         left_shoulder_yaw= 0,
#         left_shoulder_roll= 0,
#         left_elbow_pitch= 0,
#         right_shoulder_pitch= 0,
#         right_shoulder_yaw= 0,
#         right_shoulder_roll= 0,
#         right_elbow_pitch= 0,
#         torso_pitch= 0,
#         torso_yaw= 0,
#         torso_roll= 0,
#         neck_pitch= 0,
#         neck_yaw= 0,
#         neck_roll= 0
#         )
        
# """Update cases"""
# # Success case
# print(stuff.data['neck_roll'])        
# stuff.update({'neck_roll': 21})
# print(stuff.data['neck_roll'])

# # -1 case
# print(stuff.update(None))

# # -2 case
# print(stuff.update([]))

# # -3 case
# print(stuff.update({'test': 21}))

# """Remove cases"""
# # Success case
# print(stuff.data['neck_roll'])        
# print(stuff.remove(['neck_roll']))

# # -1 case
# print(stuff.remove(None))

# # # -2 case
# print(stuff.remove({}))

# # -3 case
# print(stuff.remove(['test']))

# """Add cases"""
# # Success case
# print('test' in stuff.data.keys())        
# stuff.add({'test': 21})
# print(stuff.data['test'])

# # -1 case
# print(stuff.add(None))

# # -2 case
# print(stuff.add([]))

# # -3 case
# print(stuff.add({'test': 21}))