-type 'Color'()   :: integer(). %% 'black' or 'red'
-type 'Position'()   :: integer(). %% 'black' or 'red'

%%%%%%%%%%%%%%%%%%%%%%%
%% Events data types
%%%%%%%%%%%%%%%%%%%%%%%

%%-record('TavlaPlace', { count :: integer } ).

-record('TavlaAtomicMoveServer',
         {from :: 'Position'(),
          to   :: 'Position'(),
          hits :: boolean(),
          pips :: integer()
         }).

-record(tavla_checkers,
        {color :: integer(),
         number :: integer()
        }).

-record(tavla_tour_record, {
          player_id       :: 'PlayerId'(),
          place           :: integer(),
          score           :: integer(),
          status          :: atom() | binary() %% active | eliminated 
         }).


-record('TavlaPlayerScore', {
           player_id      :: 'PlayerId'(),
%%           reason         :: atom(),
           winner = <<"none">> :: binary(),
           score_delta    :: integer(),
           score          :: integer()
                         }).

-record('TavlaSeriesResult', {
          player_id :: 'PlayerId'(),
          place :: integer(),
          winner = <<"none">> :: binary(),
          score :: integer()
                             }).

-record('PlayerTavlaStats', {
          playerId, %% : int
          playerName, %% : String;
          level, %% : int; Number
          levelName, %% : String;
          badges, %% : Array; Array of int between [1; 5],
          skill,     %% : int;
          score,     %% : int;
          totalWins, %% : int;
          totalLose, %% : int;
          totalDisconnects, %% : int;
          overalSuccessRatio, %% : Number;
          averagePlayDuration %% : Number;
          }).

-record(tavla_color_info, {
          name :: any(),
          color :: integer()
                     }).

%% -record(tavla_board, {
%%           id :: integer(),
%%           name :: any(),
%%           players :: list(#'PlayerInfo'{}),
%%           main = false :: boolean()
%%                      }).

-record('TavlaGameResults', {
%%           game_id :: integer(),
           players :: list(#'TavlaPlayerScore'{})
                     }).


%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%     EVENTS      %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%

-record(tavla_game_info, {
          table_id          :: integer(),
%%          game_type         :: atom(), %% TODO: Remove
          table_name        :: binary(),
          game_mode = undefined :: atom(),
          sets              :: null | integer(), %% total number of sets
          set_no            :: null | integer(), %% number of current set
          tables_num        :: integer(),
%%          current_round     :: integer(), %% TODO: Remove
          rounds            :: integer(),
          players           :: list(#'PlayerInfo'{}),
          speed             :: atom(),      %% [slow, normal, fast, blitz]
          turn_timeout      :: integer(),   %% timeout value for player turn
%%          challenge_timeout :: integer(),   %% TODO: Remove, timeout value for challenge 
          ready_timeout     :: integer(),   %% timeout value for ready msg
%%          timeout           :: integer(),   %% TODO: Remove
          mul_factor        :: pos_integer(),
          slang_flag        :: boolean(),
          observer_flag     :: boolean(),
          pause_enabled = true :: boolean(),
          social_actions_enabled = true :: boolean(),
          tournament_type = standalone :: atom(), %% standalone | elimination | pointing | lucky
          series_confirmation_mode = yes_exit :: yes_exit | no_exit | no
                         }).

-record(tavla_player_ready, {
          table_id  :: integer(),
          player :: 'PlayerId'()
                     }).

-record(tavla_game_started, {
          table_id       :: integer(),
          board          :: list(#tavla_checkers{} | null),
%%          another_boards :: list(#tavla_board{}),
          players        :: list(#tavla_color_info{}), %% TODO: Rename to players_colors
          current_round  :: integer(),
          round_timeout  :: null | integer(),
          set_timeout    :: null | integer(),
          do_first_move_competition_roll :: boolean()
          }).

-record(tavla_game_player_state, {
          table_id             :: integer(),
          board                :: null | list(#tavla_checkers{} | null),
          dice                 :: list(null | integer()),
          players_colors       :: list(#tavla_color_info{}),
          whos_move            :: list(integer()), %% Color
          game_state           :: initializing | first_move_competition | waiting_for_roll | waiting_for_move | finished,
          current_round        :: integer(),
          next_turn_in         :: integer() | infinity, %% milliseconds
          paused = false       :: boolean(),
          round_timeout = null :: null | integer(),
          set_timeout = null   :: null | integer()
         }).

-record(tavla_won_first_move, {
          table_id  :: integer(),
          color     :: integer(),
          player    :: 'PlayerId'(),
          dice      :: list(integer()),
          reroll    :: boolean()
                     }).

-record(tavla_next_turn, {
          table_id  :: integer(),
          color     :: integer(),
          player    :: 'PlayerId'()
                     }).

-record(tavla_rolls, {
          table_id  :: integer(),
          color     :: integer(),
          player    :: 'PlayerId'(),
          dices     :: list(integer())
                     }).

-record(tavla_moves, {
          table_id     :: integer(),
          color        :: integer(),
          player       :: 'PlayerId'(),
          from         :: 'Position'(),
          to           :: 'Position'(),
          hits = false :: boolean(),
          pips         :: integer()
                          }).

-record(tavla_turn_timeout, {
          table_id     :: integer(),
          color        :: integer(),
          player       :: 'PlayerId'(),
          dice         :: null | list(integer()),
          moves        :: null | list(#'TavlaAtomicMoveServer'{})
                            }).


%-record(tavla_vidoes, {
%          table_id  :: integer(),
%          player   :: 'PlayerId'()
%                      }).

%-record(tavla_accepts, {
%          table_id  :: integer(),
%          player   :: 'PlayerId'(),
%          accept   :: boolean()
%                      }).

%-record(tavla_timeouts, {
%          table_id  :: integer(),
%          player  :: 'PlayerId'()
%                      }).

-record(tavla_series_ended, {
          table_id  :: integer(),
          standings :: list(#'TavlaSeriesResult'{})
                            }).

-record(tavla_game_ended, {
          table_id  :: integer(),
          reason  :: binary(), %% "win", "round_timeout", "set_timeout"
          winner  :: null | 'PlayerId'(),
          results :: #'TavlaGameResults'{}
                     }).

-record(tavla_tour_result, {
          table_id         :: integer(),
          tour_num         :: integer(),
          records          :: list(#tavla_tour_record{})
         }).


%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%     ACTION      %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%

-record(tavla_ready, {table_id  :: integer()}).

-record(tavla_roll, {table_id :: any()}).

-record('TavlaAtomicMove', {from :: 'Position'(), to :: 'Position'() } ).
-record(tavla_move, { table_id  :: integer(), moves :: list(#'TavlaAtomicMove'{}), player :: 'PlayerId'() }).

-record(tavla_skip, {table_id  :: integer()}).


-record(tavla_request, {table_id  :: integer()}).

-record(tavla_vido, {table_id :: integer()}).

-record(tavla_vido_request, { table_id :: integer(),
          from :: 'PlayerId'(),
          to   :: 'PlayerId'()
                    }).

-record(tavla_vido_answer, { table_id  :: integer(),
          from :: 'PlayerId'(),
          to   :: 'PlayerId'(),
          answer :: boolean()
                    }).

-record(tavla_ack, { table_id  :: integer(),
       type :: atom(),
       from :: 'PlayerId'(),
       to   :: 'PlayerId'(),
       answer :: boolean()}).

-record(tavla_accepts_vido, { table_id  :: integer(),
          accept :: boolean()
                    }).

-record(tavla_surrender, { table_id  :: integer()}).

-record(tavla_surrender_request, { table_id  :: integer(),
          from :: 'PlayerId'(),
          to   :: 'PlayerId'()
                    }).

-record(tavla_surrender_answer, { table_id  :: integer(),
          from :: 'PlayerId'(),
          to   :: 'PlayerId'(),
          answer :: boolean()
                    }).

-record(tavla_accept_timeout, { table_id  :: integer(),
          accept = true:: boolean()
         }).

%% -record('TavlaSetState', {
%%           round_cur,
%%           round_max,
%%           set_cur,
%%           set_max
%%          }).

%% -record('TavlaTimeouts', {
%%           speed             :: atom(),      %% [slow, normal, fast, blitz]
%%           turn_timeout      :: integer(),   %% timeout value for player turn
%%           challenge_timeout :: integer(),   %% timeout value for challenge
%%           ready_timeout     :: integer(),   %% timeout value for ready msg
%%           rematch_timeout   :: integer()    %% timeout value for general api #rematch{} msg
%%          }).