@startuml
'https://plantuml.com/sequence-diagram
skinparam classAttributeIconSize 0
skinparam classFontStyle Bold
skinparam style strictuml
hide empty members

package Model{
    interface Observer{}
    interface SelectColorObserver implements Observer{
        + reactTo(color : Color)
    }

    class Combinaison {
        - combinaison : Color[*]
        + Combinaison(combinaison_size : Integer, colors: Color[*])
        + Combinaison(combinaison_size : Integer)
        + switchColor(index : Integer, color : Color)
        + compare(a: Combinaison, b: Combinaison)
    }

    enum Display{
        MENU
        GAME
        END
    }

    enum Color {
        RED
        BLUE
        YELLOW
        GREEN
        PURPLE
        PINK
    }

    class Hint {
        + Hint(combinaison : Combinaison)
    }

    class Game {
        - nb_round : Integer
        - combinaison_size : Integer
        - nb_guess : Integer
        - nb_available_color : Integer
        + set_combinaison_size(nb : Integer)
        + addGuess()
        + set_nb_available_color(nb : Integer)
        + getGuess():Integer
    }

    class Round {
        - combinaison : Combinaison
        + Round(combinaison_size : Integer)
        + getCombinaison() : Combinaison
    }
    Game *--> Round : "1.*\n- rounds"
    Game *-> Combinaison : "1\n- secret_combine"
    Game *-> Combinaison
}

package View {
    class MainWindow {
        - observers : Observer[*]
        + MainWindow()
        + SwitchDisplay(display : Display)
        + addObserver(observer : Observer)
        + notifyObservers()
    }

    class DisplayMode {
        + displayHint()
    }

    class ModeEasy extends DisplayMode {
      + displayHint()
    }
    class ModeClassic extends DisplayMode {
      + displayHint()
    }
    class ModeNumeric extends DisplayMode {
      + displayHint()
    }
}


package Controller{
    class GameController implements SelectColorObserver {
        - rounds : Round[*]
        - current_game_mode : GameMode
        + selected_color : Color
    }
}
GameController o-> Observer

MainWindow ..> Hint: <<use>>
MainWindow ..> Display: <<use>>

@enduml