// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package rps defines interfaces for playing the game Rock-Paper-Scissors.  It
// is an example of a simple Vanadium service.
//
// http://en.wikipedia.org/wiki/Rock-paper-scissors
//
// There are three different roles in the game:
//
// 1. Judge: A judge enforces the rules of the game and decides who the winner
// is. At the end of the game, the judge reports the final score to all the
// score keepers.
//
// 2. Player: A player can ask a judge to start a new game, it can challenge
// another player, and it can play a game.
//
// 3. ScoreKeeper: A score keeper receives the final score for a game after it
// ended.
package rps

import (
	"time"
	"v.io/v23/security/access"
)

type RockPaperScissors interface {
  Judge
  Player
  ScoreKeeper
}

type Judge interface {
  // CreateGame creates a new game with the given game options and returns a game
  // identifier that can be used by the players to join the game.
  CreateGame(Opts GameOptions) (GameId | error) {access.Write}
  // Play lets a player join an existing game and play.
  Play(Id GameId) stream<PlayerAction,JudgeAction> (PlayResult | error) {access.Write}
}

// A GameId is used to uniquely identify a game within one Judge.
type GameId struct {
  Id string
}

// GameOptions specifies the parameters of a game.
type GameOptions struct {
  NumRounds int32        // The number of rounds that a player must win to win the game.
  GameType  GameTypeTag  // The type of game to play: Classic or LizardSpock.
}

type GameTypeTag byte
const (
  Classic     = GameTypeTag(0)  // Rock-Paper-Scissors
  LizardSpock = GameTypeTag(1)  // Rock-Paper-Scissors-Lizard-Spock
)

type PlayerAction union {
  Move string  // The move that the player wants to make.
  Quit Unused  // Indicates that the player is quitting the game.
}

// TODO(toddw): Replace Unused with the unnamed empty struct{}.
type Unused struct{}

type JudgeAction union {
  PlayerNum    int32      // The player's number.
  OpponentName string     // The name of the opponent.
  MoveOptions  []string   // A list of allowed moves that the player must choose from.
  RoundResult  Round      // The result of the previous round.
  Score        ScoreCard  // The result of the game.
}

type PlayersMoves [2]string

// Round represents the state of a round.
type Round struct {
  Moves       PlayersMoves  // Each player's move.
  Comment     string        // A text comment from judge about the round.
  Winner      WinnerTag     // Who won the round.
  StartTime   time.Time     // The time at which the round started.
  EndTime     time.Time     // The time at which the round ended.
}

// WinnerTag is a type used to indicate whether a round or a game was a draw,
// was won by player 1 or was won by player 2.
type WinnerTag byte
const (
  Draw    = WinnerTag(0)
  Player1 = WinnerTag(1)
  Player2 = WinnerTag(2)
)

// PlayResult is the value returned by the Play method. It indicates the outcome of the game.
type PlayResult struct {
  YouWon bool  // True if the player receiving the result won the game.
}

// Player can receive challenges from other players.
type Player interface {
  // Challenge is used by other players to challenge this player to a game. If
  // the challenge is accepted, the method returns nil.
  Challenge(Address string, Id GameId, Opts GameOptions) error {access.Write}
}

// ScoreKeeper receives the outcome of games from Judges.
type ScoreKeeper interface {
  Record(Score ScoreCard) error {access.Write}
}

type ScoreCard struct {
  Opts        GameOptions // The game options.
  Judge       string      // The name of the judge.
  Players     []string    // The name of the players.
  Rounds      []Round     // The outcome of each round.
  StartTime   time.Time   // The time at which the game started.
  EndTime     time.Time   // The time at which the game ended.
  Winner      WinnerTag   // Who won the game.
}
