# (c) Reflection 2026 Baltasar MIT License <jbgarcia@uvigo.es>


def to_dict(obj):
    id_members = dir(obj)
    toret = {}

    for id_member in id_members:
        val = getattr(obj, id_member)
        toret[id_member] = val
            
    return toret


def to_str_list(obj):
    members = to_dict(obj)
    toret = type(obj).__name__ + ":\n"

    for id_member in members.keys():
        val = getattr(obj, id_member)
        if callable(val):
            toret += "\t" + id_member + "()\n"
        else:
            qt = ""
            if isinstance(val, str):
                qt = '\"'
            toret += f"\t{id_member}: {qt}{val}{qt}\n"
            
    return toret
    
    
class SuperHero:
    def __init__(self, name, alter_ego, power):
        self._name = name
        self._alter_ego = alter_ego
        self._power = power
        self._transformed = False
        
    def transform(self):
        self._transformed = not(self._transformed)
        
    def __getattr__(self, atr_name):
        if atr_name == "name":
            return self._alter_ego if self._transformed else self._name
        
        if atr_name == "power":
            return 0 if not self._transformed else self._power
        
        if atr_name == "is_transformed":
            return lambda: self._transformed
        
        return AttributeError(atr_name)
    
    def __getattribute__(self, atr_name):
        if (atr_name == "transform"
        and self._name == "Bruce Banner"
        and self._transformed):
                return lambda: None

        return super().__getattribute__(atr_name)
    
    def __str__(self):
        return f"{self.name}/{self.power} {'*' if self.is_transformed() else ''}"


class Struct:
    def __setattr__(self, atr_name, val):
        self.__dict__["_" + atr_name] = val
        
    def __getattr__(self, atr_name):
        toret = self.__dict__["_" + atr_name]
        
        if not toret:
            raise AttributeError(atr_name)
        
        return toret
    
    def __str__(self):
        pairs = self.__dict__.items()
        return ("{"
                + str.join(", ", [pair[0][1:] + ": " + str(pair[1]) for pair in pairs])
                + "}")
    
    
class Sequence:
    def __init__(self):
        self._l = []
        
    def __iadd__(self, val):
        self._l.append(val)
        return self

    def __getitem__(self, item):
        return self._l[item]
    
    def __len__(self):
        return len(self._l)
    
    def __str__(self):
        return str.join(", ", [str(x) for x in self._l])


def chk_listing():
    from superhero import SuperHero
    
    s1 = SuperHero("Clark Kent", "Superman", 100_000_000)
    print(to_dict(s1))
    print(to_dict(123))
    print(to_dict("a"))
    
    print(to_str_list(s1))
    print(to_str_list(123))
    print(to_str_list("a"))


def chk_superheroes():
    superheroes = [
        SuperHero("Clark Kent", "Superman", 100000000),
        SuperHero("Bruce Banner", "Hulk", 100000)]

    print("--- Pasando de humanos normales a superhéroes")
    for superhero in superheroes:
        print(f"\n{superhero}")
        superhero.transform()
        print(superhero)
        
    print("\n\n--- Transformando a Hulk (pero no se puede)")
    superheroes[1].transform()
    print(superheroes[1])


def chk_sequence():
    s1 = Sequence()
    s1 += 0x000000
    s1 += 0x0000ff
    s1 += 0xff00ff
    s1 += 0x00ff00
    s1 += 0x00ffff
    s1 += 0xffffff
    
    for i, color in enumerate(s1):
        print(f"Color {i + 1}:", color)
        
    print(s1)
    print(f"#s1={len(s1)}, s1[2]={s1[2]}")
    
    
def chk_struct():
    s1 = Struct()
    s1.model = "A3"
    s1.maker = "Audi"
    s1.style = "Sportback"
    s2 = Struct()
    s2.name = "Raymond Poulidor"
    s2.team = "Mercier"
    print(s1)
    print(f"{s1.maker} {s1.model} {s1.style}")
    print(s2)
    print(f"{s2.name} ({s2.team})")
    

if __name__ == "__main__":
    #chk_listing()
    #chk_struct()
    #chk_superheroes()
    chk_sequence()

