@startuml Diagramme de classe

abstract class Utilisateur {
    - String nom
    - String prenom
    - String email
    - String telephone
    - boolean notification
    
    + void Utilisateur(String nom, String prenom, String email)
    + void notifier(RDV rdv)
    + boolean ajouterRDV(RDV rdv)
    + boolean annulerRDV(RDV rdv)
    + boolean prendreRDV(List<Professeur> profs, List<Eleve> eleves, LocalDateTime date, String titre, String description)
}

class Professeur {
    + Professeur(String nom, String prenom, String email)
}

class Eleve {
    + Eleve(String nom, String prenom, String email)
}

class Disponibilite {
    - LocalDateTime debut
    - LocalDateTime fin

    + Disponibilite(LocalDateTime debut, LocalDateTime fin)
}

class RDV {
    - String titre
    - String description
    - LocalDateTime horaire
    
    + RDV(LocalDateTime horaire, List<Utilisateur> utilisateurs, String description)
    + void setState(EtatRendezVous etatRendezVous)
    + void annule()
    + void confirmer()
    + void realiser()
    + void demande()
}

abstract class EtatRDV {
    - RendezVous rdv
    + confirmePour(Utilisateur utilisateur)
    + void annule()
    + void confirmer()
    + void realiser()
    + void demande()
}

class Demande {
}

class Confirme {
}

class Realise {
}

class Annule {
}


class Ecole {
    - String nom
    + Ecole(String nom)
}

class Salle {
    - int numero
    - int etage
    - String aile

    + Salle(int numero)
    + int getNumero()
    + int getEtage()
    + String getAile()
}


Utilisateur "*" --- "*" RDV
Ecole "1" --- "*" Utilisateur
Ecole "1" --- "*" Salle


EtatRDV <|.. Confirme
EtatRDV <|.. Annule
EtatRDV <|.. Realise
EtatRDV <|.. Demande

RDV "1" --- "1" EtatRDV
RDV "1" --- Salle
Professeur "1" --- Salle

Utilisateur  <|--  Professeur
Utilisateur  <|--  Eleve
Professeur --- "*" Disponibilite

@enduml