import termcolor
from dataclasses import *
from abc import *
from typing import *
from sccd.util.duration import *

# An event that can cause transitions to happen.
# Input events are internal events too.
@dataclass
class InternalEvent:
    __slots__ = ["id", "name", "params"]

    id: int
    name: str # solely used for pretty printing
    params: List[Any]

    def __str__(self):
        s = "Event("+self.name
        if self.params:
            s += str(self.params)
        s += ")"
        return termcolor.colored(s, 'yellow')

    __repr__ = __str__
    

@dataclass
class OutputEvent:
    __slots__ = ["port", "name", "params"]

    port: str
    name: str
    params: List[Any]

    # Compare by value
    def __eq__(self, other):
        return self.port == other.port and self.name == other.name and self.params == other.params

    def __str__(self):
        s = "OutputEvent("+self.port+"."+self.name
        if self.params:
            s += str(self.params)
        s += ")"
        return termcolor.colored(s, 'yellow')

    __repr__ = __str__
