from enum import Enum, auto

class X():
    class Colour(Enum):
        def _generate_next_value_(name, start, count, last_values):
            return name
        def __str__(self):
            return str(self.value)
        Red = auto()
        Blue = auto()
        Green = auto()

    class Sm(Enum):
        def _generate_next_value_(name, start, count, last_values):
            return name
        def __str__(self):
            return str(self.value)
        s1 = auto()
        s2 = auto()

    def __init__(self, aDefaultAttr):
        self._defaultAttr = aDefaultAttr
        if not self.setMyName(aMyName) :
            raise RuntimeError ("Cannot create due to duplicate myName. See https://manual.umple.org?RE003ViolationofUniqueness.html")

        self.setSm(X.Sm.s1)

    def setMyName(self, aMyName):
        wasSet = False
        anOldMyName = self.getMyName()
        if anOldMyName != None and anOldMyName.equals(aMyName) :
            return True

        if self.hasWithMyName(aMyName) :
            return wasSet

        self._myName = aMyName
        wasSet = True
        if not(anOldMyName is None) :
            xsByMyName.remove(anOldMyName)

        xsByMyName.put(aMyName, self)
        return wasSet

    def setDefaultAttr(self, aDefaultAttr):
        wasSet = False
        self._defaultAttr = aDefaultAttr
        wasSet = True
        return wasSet

    def getMyName(self):
        return self._myName

    public static X getWithMyName (String aMyName)
    {
        return xsByMyName.get(aMyName);
    }
    public static boolean hasWithMyName (String aMyName)
    {
        return getWithMyName(aMyName) != null;
    }
    def getDefaultAttr(self):
        return self._defaultAttr

    def getSmFullName(self):
        answer = str(self._sm)
        return answer

    def getSm(self):
        return self._sm

    def goToS2(self):
        wasEventProcessed = False
        aSm = self._sm
        match aSm :
            case X.Sm.s1 :
                self.setSm(X.Sm.s2)
                wasEventProcessed = True
            case default :
                pass
        return wasEventProcessed

    def setSm(self, aSm):
        self._sm = aSm

    def delete(self):
        xsByMyName.remove(self.getMyName())

    def __str__(self):
        return str(super()) + "[" + "myName" + ":" + self.getMyName() + "," + "defaultAttr" + ":" + self.getDefaultAttr() + "]"

