//! The ids for messages that we use. They will be used consistent across the server and the client.
//! Also contains the protocol structure for joining a game.

use serde::{Deserialize, Serialize};

/// The buffer sizes for the channels for intra VPS communication.
pub const CHANNEL_BUFFER_SIZE: usize = 256;

// Client -> Server.

/// The message to announce a new client (Client->Server) followed by u16 client id.
pub const NEW_CLIENT: u8 = 0;
/// The message size for a new client (Header + Client Id) (u8 + u16)
pub const NEW_CLIENT_MSG_SIZE: usize = 3;

/// A client disconnects from the game. (Client->Server) and removes him from the room. followed by u16 client id.
pub const CLIENT_DISCONNECTS: u8 = 1;
/// The disconnect client message size (Header + Client Id) (u8 + u16)
pub const CLIENT_DISCONNECT_MSG_SIZE: usize = 3;

/// Client -> Server RPC followed by u16 Clientid, followed by payload from postcard or other coding.  (Client->Server)
pub const SERVER_RPC: u8 = 2;

/// The disconnection message that is used for disconnecting without any arguments, that gets passed through the web socket layer.
pub const CLIENT_DISCONNECTS_SELF: u8 = 3;

// Server -> Client

/// The server disconnects from the game and the room gets closed.
pub const SERVER_DISCONNECTS: u8 = 0;
/// The disconnection message is just the byte itself.
pub const SERVER_DISCONNECT_MSG_SIZE: usize = 1;

/// A client gets kicked, meant for the situation, when no more clients should get accepted. followed by u16 client id. The receiving tokio task has to act on its own. (Server -> Client)
pub const CLIENT_GETS_KICKED: u8 = 1;

/// Delta update. Followed by payload for every delta update. May carry several delta messages in one pass.
pub const DELTA_UPDATE: u8 = 2;

/// Flagging a full update. Followed by payload for full update.
pub const FULL_UPDATE: u8 = 3;

/// The message to reset the game. This is also followed by a full update. Difference is, that every client will get the full update.
pub const RESET: u8 = 4;

/// The error message we add.
pub const SERVER_ERROR: u8 = 5;

/// The response message for the handshake.
pub const HAND_SHAKE_RESPONSE: u8 = 6;

// Sizes of entries.
/// For the handshake we respond with player id (u16), rule variation (u16), and reconnect token (u64).
pub const HAND_SHAKE_RESPONSE_SIZE: usize = 13;

/// The size of a new client. (u16)
pub const CLIENT_ID_SIZE: usize = 2;

/// The join request. This struct is used on the server and on the client.
#[derive(Deserialize, Serialize)]
pub struct JoinRequest {
    /// Which game do we want to join.
    pub game_id: String,
    /// Which room do we want to join.
    pub room_id: String,
    /// The rule variation that is applied, this gets only interpreted if a room gets constructed.
    pub rule_variation: u16,
    /// Do we want to create a room and act as a server?
    pub create_room: bool,
    /// Reconnect token from a previous session. `None` = fresh join/create, `Some` = reconnect.
    pub reconnect_token: Option<u64>,
}
