package industries.sunshine.planningpoker.common import java.util.UUID import io.circe._ object Models { /** view of the single planning poker round * @param players - people who are currently playing * @param allowedCards- the cards values that can be used by players * @param round - state of the selected cards of the players * @param canCloseRound - whether current player has access to button to finish the round */ final case class RoomStateView( players: List[Player], me: PlayerID, allowedCards: List[String], round: RoundState, canCloseRound: Boolean = false ) derives Codec.AsObject { def playersCount: Int = players.size } object RoomStateView { val empty = RoomStateView( List.empty, PlayerID(0), List.empty, RoundState.Voting(None, List.empty), false ) } enum RoundState derives Codec.AsObject: /** view state for round before votes are open player can know their vote and * who of the other players have voted */ case Voting( myCard: Option[String], alreadyVoted: List[Player] ) /** view state for round after opening the votes */ case Viewing( votes: List[(PlayerID, String)] ) final case class PlayerID(id: Long) derives Codec.AsObject final case class Player(name: String, id: PlayerID) derives Codec.AsObject final case class RoomID(id: Long) derives Codec.AsObject }