from abc import ABCMeta, abstractmethod
import uuid

class ModuleList():
    
    def __init__(self):
        self._modules = []
        
    def add_module(self, module):
        assert isinstance(module, Module), 'invalid module'
        if module in self._modules:
            raise ValueError('Module %s already in database' % module)
        else:
            self._modules.append(module)
            
    def remove_module(self, module):
        assert isinstance(Module, module), 'invalid module'
        try:
            self._module.remove(module)
        except ValueError:
            raise ValueError('Module %s is not in database' % module)
        
    def lookup_module(self, uuid):
        for module in self._modules:
            if module.uuid == uuid:
                return module
            
    def new_module(self, device_type, address, interface):
        
        if device_type == 0x01:
            module = AirSenseModule(device_type, address, interface)
        elif device_type == 0x02:
            module = RelayDriveModule(device_type, address, interface)
        else:
            module = UnknownModule(device_type, address, interface)
        
        self.add_module(module)
        
        return module

class Module(metaclass=ABCMeta):

    def __init__(self, device_type, address, interface):
        self.device_type = device_type
        self.address = address
        self.interface = interface
        
        self.uuid = uuid.uuid1()
        print("Created new module! " + str(self.uuid))
    
    @abstractmethod
    def send_message(self):
        pass
    
    @abstractmethod
    def receive_message(self):
        pass

class AirSenseModule(Module):
    
    def __init__(self, device_type, address, interface):
        super(AirSenseModule, self).__init__(device_type, address, interface)
    
    def send_message(self):
        message = None
        self.interface.network.send_message(message)
    
    def receive_message(self):
        print("AirSenseModule receive message!")

class RelayDriveModule(Module):
    
    def __init__(self, device_type, address, interface):
        super(RelayDriveModule, self).__init__(device_type, address, interface)
    
    def send_message(self):
        pass
    
    def receive_message(self):
        print("RelayDriveModule receive message!")

class UnknownModule(Module):
    
    def __init__(self, device_type, address, interface):
        super(UnknownModule, self).__init__(device_type, address, interface)
    
    def send_message(self):
        pass
    
    def receive_message(self):
        print("UnknownModule receive message!")
        
