using System;
using OWML.Common;
using UnityEngine;
using UnityEngine.Events;
public interface IQSBAPI
{
#region General
///
/// If called, all players connected to YOUR hosted game must have this mod installed.
///
void RegisterRequiredForAllPlayers(IModBehaviour mod);
///
/// Returns if the current player is the host.
///
bool GetIsHost();
///
/// Returns if the current player is in multiplayer.
///
bool GetIsInMultiplayer();
#endregion
#region Player
///
/// Returns the player ID of the current player.
///
uint GetLocalPlayerID();
///
/// Returns the name of a given player.
///
/// The ID of the player you want the name of.
string GetPlayerName(uint playerID);
///
/// Returns the list of IDs of all connected players.
///
/// The first player in the list is the host.
///
uint[] GetPlayerIDs();
///
/// Invoked when any player (local or remote) joins the game.
///
UnityEvent OnPlayerJoin();
///
/// Invoked when any player (local or remote) leaves the game.
///
UnityEvent OnPlayerLeave();
///
/// Sets some arbitrary data for a given player.
///
/// The type of the data. If not serializable, data will not be synced.
/// The ID of the player.
/// The unique key to access this data by.
/// The data to set.
void SetCustomData(uint playerId, string key, T data);
///
/// Returns some arbitrary data from a given player.
///
/// The type of the data.
/// The ID of the player.
/// The unique key of the data you want to access.
/// The data requested. If key is not valid, returns default.
T GetCustomData(uint playerId, string key);
#endregion
#region Messaging
///
/// Sends a message containing arbitrary data to every player.
///
/// Keep your messages under around 1100 bytes.
///
/// The type of the data being sent. This type must be serializable.
/// The unique key of the message.
/// The data to send.
/// The player to send this message to. (0 is the host, uint.MaxValue means every player)
/// If true, the action given to will also be called on the same client that is sending the message.
void SendMessage(string messageType, T data, uint to = uint.MaxValue, bool receiveLocally = false);
///
/// Registers an action to be called when a message is received.
///
/// The type of the data in the message.
/// The unique key of the message.
/// The action to be ran when the message is received. The uint is the player ID that sent the messsage.
void RegisterHandler(string messageType, Action handler);
#endregion
#region Chat
///
/// Invoked when a chat message is received.
/// The string is the message body.
/// The uint is the player who sent the message. If it's a system message, this is uint.MaxValue.
///
UnityEvent OnChatMessage();
///
/// Sends a message in chat.
///
/// The text of the message.
/// If false, the message is sent as if the local player wrote it manually. If true, the message has no player attached to it, like the player join messages.
/// The color of the message.
void SendChatMessage(string message, bool systemMessage, Color color);
#endregion
}