from typing import Final


class Insegnamento:
    def __init__(self, codice:int, nome:str, corso_di_studio:str) -> None:
        self._codice:Final[int]=codice
        self._nome=nome
        self._corso_di_studio = corso_di_studio

    @property
    def codice (self)->int:
        return self._codice
    
    @property
    def nome(self)->str:
        return self._nome
    
    @nome.setter
    def nome (self, nome:str):
        self._nome = nome

    @property
    def corso_di_studio (self)->str:
        return self._corso_di_studio
    
    @corso_di_studio.setter
    def corso_di_studio (self, corso_di_studio:str):
        self._corso_di_studio = corso_di_studio


    def __eq__(self, o: object) -> bool:
        if not isinstance(o,Insegnamento): return NotImplemented
        return self.codice==o.codice
    
        if isinstance(o,Insegnamento): 
            return self.codice==o.codice            
        return NotImplemented
    
    def __str__ (self) -> str:
        return f"Insegnamento del corso di studio {self.corso_di_studio}: codice {self.codice} e nome {self.nome}"
    
class InsegnamentoMutuato (Insegnamento):
    def __init__(self, codice: int, nome: str, corso_di_studio: str, mutua_su:Insegnamento) -> None:
        super().__init__(codice, nome, corso_di_studio)
        self._mutua_su= mutua_su

    @property
    def mutua_su (self)->Insegnamento:
        return self._mutua_su
    

class Ateneo:
    insegnamenti: list[Insegnamento] = []

    def estrai_cds (self) -> list[str]:
        ris:list[str] = []
        for i in self.insegnamenti:
            if i.corso_di_studio not in ris:
                ris.append(i.corso_di_studio)
        return ris
    
    def conta_non_mutui (self, corso_di_studio:str) -> int:
        ris = 0
        for i in self.insegnamenti:
            if i.corso_di_studio == corso_di_studio \
                and not isinstance (i,InsegnamentoMutuato):
                ris += 1
        return ris
    
    def corsi_con_più_insegnamenti_mutuati(self) -> list [str]:
        lista_cds = self.estrai_cds()
        ris:list[str] = []
        max:int =0
        for cds in lista_cds:
            conto = self.conta_non_mutui(cds)
            if conto == max:
                ris.append(cds)
            if conto > max:
                ris = [cds]
                max = conto
        return ris

    

    
