classDiagram
    class Sanity {
    <<enumeration>>
        SANE
        INSANE
        NEUTRAL
    }

    class Card {
    <<abstract>>
        - name : string
        - description : string
        - value : int
        - sanity : Sanity

        + Card(_name : string, _description : string, _value : int)
        + getDescrption() string
        + getName() string
        + getValue() int
        + hasInsane()* bool
        + effect(sanity : Sanity)* void
    }

    class SaneCard {
    <<abstract>>
        + SaneCard(_name : string, _description : string, _value : int)
        + effect(sanity : Sanity)* void
        + hasInsane() bool
    }

    class InsaneCard {
    <<abstract>>
        + InsaneCard(_name : string, _description : string, _value : int)
        + effect(sanity : Sanity)* void
        + hasInsane() bool
    }

    class SpecifiedCard {
        + SpecifiedCard(_name : string, _description : string, _value : int)
        + effect(sanity : Sanity) void
    }

    class GameManager {
        - roundNumber : int

        + GameManager(nbPlayer : int)
        + isGameEnd() : int
    }

    class Player {
        - saneToken : int
        - insaneToken : int

        + updateToken() void
        + getHand() : List<Card>
        + getDiscard() : List<Card>
        + getSaneToken() int
        + getInsaneToken() int
        + roundWon() : void
    }

    class Application {
        + Application()
    }

    Card <|.. SaneCard
    InsaneCard <|.. SaneCard
    SpecifiedCard <|.. SaneCard
    SpecifiedCard <|.. InsaneCard
    Player "1" -- "0..*" Card : hand
    Player "1" -- "0..*" Card : discard
    GameManager "1" -- "0..*" Card : deck
    GameManager "1" -- "2..6" Player
    GameManager "1" -- "1" Player : Current
    Application "1" -- "1" GameManager
