// Interface

interface GameHubServer {
    join(tableId: number);
    leave(tableId: number);
    subscribeLobby();
    unsubscribeLobby();
    subscribeTournamentLobby();
    unsubscribeTournamentLobby();
    subscribeTournament(tournamentId: number);
    unsubscribeTournament(tournamentId: number);
}

interface StatusResponse {
    Status: string;
}

interface ApiResult<T> {
    Status: string;
    Data: T;
}

/**
* Response for the RegisterGuest API call.
*/
interface AuthenticateResponse extends StatusResponse {
	/**
	* Id of the authorized user, or 0 otherwise.
	*/
	Id: number;

	/**
	* A value indicating whether this user is guest or not.
	*/
	IsGuest: boolean;

	/**
	* First name of the user.
	*/
	FirstName: string;

	/**
	* Last name of the user.
	*/
	LastName: string;

	/**
	* Patronymic name of the user.
	*/
	PatronymicName: string;

	/**
	* Login of the user.
	*/
	Login: string;

	/**
	* Money which player has in different currencies.
	*/
	Money: number[];

	/**
	* Email of the user.
	*/
	Email: string;

	/**
	* Country of the user.
	*/
	Country: string;

	/**
	* City of the user
	*/
	City: string;

	/**
	* Url of the image to display in the UI
	*/
	ImageUrl: string;

	/**
	* Gets or sets additional properties for the player.
	*/
	Properties: any;
}

/**
* Response for the RegisterGuest API call.
*/
interface RegisterGuestResponse extends StatusResponse {
    UserId: number;
    Login: string;
    Password: string;
}

/**
* Response for the VersionCheck API call
*/
interface VersionCheckResponse {
    /**
    * Current version of server API.
    */
    ServerApiVersion: number;
    /**
    * Minimum compatible version of client API.
    */
    MinimumClientApiVersion: number;
}

interface PlayerStatusInfo {
    PlayerId: number;
    PlayerName: string;
    PlayerUrl: string;
    Money: number;
    Seat: number;
    Cards: string;
    Bet: number;
    Status: number;
    Points: number;
    Stars: number;
}

interface UserRating {
    Id: number;
    Login: string;
    Points: number;
    Stars: number;
}

interface GameWinnerModel {
    PlayerId: number;
    Pot: number;
    CardsDescription: string;
    Amount: number;
}

interface PlayerDefinitionProperties {
    Language: string;
    Points: string;
    Stars: string;
}

interface PlayerDefinition {
    Email: string;
    FirstName: string;
    LastName: string;
    RealMoney: number;
    GameMoney: number;
    Points: number;
    Properties: PlayerDefinitionProperties;
}

interface PersonalAccountData {
    RealMoney: number;
    RealMoneyReserve: number;
    GameMoney: number;
    GameMoneyReserve: number;

    /**
    * Amount of points
    */
    Points: number;
    LastIncomeDate: string;
    LastIncomeAmount: number;
    LastRequestNumber: number;
}

interface GameTableModel {
    TableId: number;
    TableName: string;
    SmallBlind: number;
    BigBlind: number;
    AveragePotSize: number;
    CurrencyId: number;
    HandsPerHour: number;
    IsAuthorized: boolean;
    JoinedPlayers: number;
    MaxPlayers: number;
    PotLimitType: number;
    TournamentId?: number;
}

interface BannerData {
    /**
    * Id of the banner
    */
    Id: number;

    /**
    * Text representation of the banner
    */
    Title: string;

    /**
    * URL which could be used to retrieve banner.
    */
    Url: string;

    /**
    * URL which could be used to navigate when click on the banner.
    */
    Link: string;
}

interface GamePlayerStartInformation {
    /**
    * Id of the player which participate in the game.
    */
    PlayerId: number;
    /**
    * Money which player has on hand.
    */
    Money: number;
}

interface GameActionStartInformation {
    /**
    * Id of the player which executed action in the game.
    */
    PlayerId: number;
    /**
    * Type of executed action
    */
    Type: number;
    /**
    * Amount of money which put in the pot
    */
    Amount: number;
}

interface ChatHubServer {
    join(tableId: number);
    leave(tableId: number);
}

interface ChatHubClient {
    ChatConnected: (tableId: number, lastMessageId: number) => void;
    Message: (messageId: number, tableId: number, type: string, sender: string, message: string) => void;
    MessageChanged: (messageId: number, tableId: number, type: string, sender: string, message: string) => void;
}

interface TournamentPrizeStructure {
    MaxPlayer: number;
    PrizeLevel: number[];
}
interface TournamentBetStructure {
    Level: number;
    SmallBlind: number;
    BigBlind: number;
    Ante: number;
}

/**
* Table information in the lobby.
*/
interface LobbyTableItem {
    /**
    * Unique id of the table.
    */
    TableId: number;

    /**
    * Name of the table
    */
    TableName: string;

    /**
    * A value indicating whether player is authorized play games on this table.
    */
    IsAuthorized: boolean;
    SmallBlind: number;
    BigBlind: number;
    JoinedPlayers: number;
    MaxPlayers: number;
    PotLimitType: number;
    AveragePotSize: number;
    HandsPerHour: number;
    CurrencyId: number;
    SeatMask: number;
}

/**
* DTO for the tournament player information.
*/
interface TournamentTablePlayerDefinition {
    /**
    * Gets or sets Id of the player
    */
    PlayerId: number;

    /**
    * Gets or sets name of the player.
    */
    PlayerName: string;

    /**
    * Gets or sets amount of money which player currently has.
    */
    PlayerMoney: number;
}

/**
* DTO for the tournament table information.
*/
interface TournamentTableDefinition {
    /**
    * Gets or sets unique id of the table.
    */
    TableId: number;

    /**
    * Gets or sets name of the table.
    */
    TableName: string;

    /**
    * Gets or sets number of players which joins the game.
    */
    JoinedPlayers: number;

    /**
    * Gets or sets a value indicating whether table is closed.
    */
    IsClosed: boolean;

    /**
    * Gets or sets list of the players which is sitting on the table now.
    */
    Players: TournamentTablePlayerDefinition[];
}

interface BaseRequest<T> {
    Status: string;
    Data: T;
}

interface OperationData {
    Amount: number;
    OperationDate: string;
    Operation: number;
    Comments: number;
    BookingOffice: string;
    Status: string;
}
