from importlib import import_module


class Base:
    pass


def load_alarm_model(model):
    try:
        return import_module('alerta.models.alarms.%s' % model.lower())
    except Exception:
        raise ImportError('Failed to load %s alarm model' % model)


class AlarmModel(Base):
    name = None

    Severity = {}  # type: ignore
    Colors = {}  # type: ignore
    Status = {}  # type: ignore

    DEFAULT_STATUS = None  # type: str
    DEFAULT_NORMAL_SEVERITY = None  # type: str
    DEFAULT_PREVIOUS_SEVERITY = None  # type: str
    NORMAL_SEVERITY_LEVEL = None  # type: str

    def __init__(self, app=None):
        self.app = None
        if app is not None:
            self.register(app)

    def init_app(self, app):
        cls = load_alarm_model(app.config['ALARM_MODEL'])
        self.__class__ = type('AlarmModelImpl', (cls.StateMachine, AlarmModel), {})
        self.register(app)

    def register(self, app):
        raise NotImplementedError

    def trend(self, previous, current):
        raise NotImplementedError

    def transition(self, alert, current_status=None, previous_status=None, action=None, **kwargs):
        raise NotImplementedError

    @staticmethod
    def is_suppressed(alert):
        raise NotImplementedError