import { EventBus } from "../events/EventBus";
import { Player } from "./Player";
import { Card, Deck, Hand } from "./card/index";
import { Seat } from "./Seat";
export declare enum TableState {
    WAITING = "waiting",
    ACTIVE = "active",
    ENDED = "ended"
}
/**
 * Represents a game table with players, seats, and game state.
 *
 * ✅ Attribute Support
 *
 * The Table class manages a group of players and seats for a specific game.
 * It emits various events to notify other components about changes in the table state.
 *
 * This class is responsible for:
 * - Managing player connections and disconnections
 * - Handling player messages and commands
 * - Distributing game events to all players
 * - Maintaining the game state and rules
 */
export declare class Table {
    readonly id: string;
    private players;
    private seats;
    private eventBus;
    private state;
    private readonly totalSeats;
    private readonly maxSeatsPerPlayer;
    private attributes;
    private deck;
    constructor(eventBus: EventBus, totalSeats: number, maxSeatsPerPlayer: number, id?: string);
    /**
     * Creates a new deck for the table. Emits TABLE_EVENTS.DECK_CREATED when the deck is created.
     * @param numberOfDecks - The number of decks to create.
     */
    createDeck(numberOfDecks?: number): void;
    /**
     * Gets the current deck.
     * @returns The deck object or null if no deck has been created.
     */
    getDeck(): Deck | null;
    /**
     * Shuffles the current deck. Emits TABLE_EVENTS.DECK_SHUFFLED when the deck is shuffled.
     * @returns True if the deck was shuffled, false if no deck exists.
     */
    shuffleDeck(): boolean;
    /**
     * Draws a card from the deck. Emits TABLE_EVENTS.DECK_CARD_DRAWN when a card is drawn.
     * @param isVisible - Whether the card should be visible to the player.
     * @returns The drawn card or null if no deck exists.
     */
    drawCard(isVisible?: boolean): Card | null;
    /**
     * Deals a card to a seat. Emits TABLE_EVENTS.CARD_DEALT when a card is dealt.
     * @param seatIndex - The index of the seat to deal the card to.
     * @param isVisible - Whether the card should be visible to the player.
     * @param handId - The ID of the hand to deal the card to.
     * @returns True if the card was dealt, false if no deck exists.
     */
    dealCardToSeat(seatIndex: number, isVisible?: boolean, handId?: string): boolean;
    /**
     * Gets a hand at a specific seat.
     * @param seatIndex - The index of the seat to get the hand from.
     * @param handId - The ID of the hand to get.
     * @returns The hand object or null if no hand exists.
     */
    getHandAtSeat(seatIndex: number, handId?: string): Hand | null;
    /**
     * Deals a card to a hand. Emits TABLE_EVENTS.CARD_DEALT when a card is dealt.
     * @param hand <Hand> - The hand to deal the card to.
     * @returns True if the card was dealt, false if no seat or hand exists.
     */
    dealCardToHand(hand: Hand): boolean;
    /**
     * Gets all hands at a specific seat.
     * @param seatIndex - The index of the seat to get the hands from.
     * @returns A map of hand IDs to hand objects or null if no seat exists.
     */
    getAllHandsAtSeat(seatIndex: number): Map<string, Hand> | null;
    /**
     * Clears a hand at a specific seat. Emits TABLE_EVENTS.SEAT_HAND_CLEARED when a hand is cleared.
     * @param seatIndex - The index of the seat to clear the hand from.
     * @param handId - The ID of the hand to clear.
     * @returns True if the hand was cleared, false if no seat exists.
     */
    clearHandAtSeat(seatIndex: number, handId?: string): boolean;
    /**
     * Clears all hands at the table. Emits TABLE_EVENTS.SEATS_HANDS_CLEARED when all hands are cleared.
     */
    clearAllHands(): void;
    /**
     * Adds a hand to a seat. Emits TABLE_EVENTS.SEAT_HAND_ADDED when a hand is added to a seat.
     * @param seatIndex - The index of the seat to add the hand to.
     * @param handId - The ID of the hand to add.
     * @returns True if the hand was added, false if no seat exists.
     */
    addHandToSeat(seatIndex: number, handId: string): boolean;
    /**
     * Removes a hand from a seat. Emits TABLE_EVENTS.SEAT_HAND_REMOVED when a hand is removed from a seat.
     * @param seatIndex - The index of the seat to remove the hand from.
     * @param handId - The ID of the hand to remove.
     * @returns True if the hand was removed, false if no seat exists.
     */
    removeHandFromSeat(seatIndex: number, handId: string): boolean;
    /**
     * Adds a player to the table. Emits TABLE_EVENTS.PLAYER_JOINED when a player joins the table.
     * @param player - The player to add.
     * @returns True if the player was added, false if the player is already at a table.
     */
    addPlayer(player: Player): boolean;
    /**
     * Removes a player from the table. Emits TABLE_EVENTS.PLAYER_LEFT when a player leaves the table.
     * @param playerId - The ID of the player to remove.
     * @returns True if the player was removed, false if the player is not at the table.
     */
    removePlayer(playerId: string): boolean;
    /**
     * Sits a player at a specific seat. Emits TABLE_EVENTS.PLAYER_SAT when a player sits at a seat.
     * @param playerId - The ID of the player to sit.
     * @param seatIndex - The index of the seat to sit the player at.
     * @returns True if the player was seated, false if the seat is invalid or already taken.
     */
    sitPlayerAtSeat(playerId: string, seatIndex: number): boolean;
    /**
     * Removes a player from a seat. Emits TABLE_EVENTS.PLAYER_STOOD when a player stands up from a seat.
     * @param seatIndex - The index of the seat to remove the player from.
     * @returns True if the player was removed from the seat, false if the seat is invalid or no player is seated.
     */
    removePlayerFromSeat(seatIndex: number): boolean;
    /**
     * Gets the number of seats a player is seated at.
     * @param playerId - The ID of the player to get the seat count for.
     * @returns The number of seats the player is seated at.
     */
    getPlayerSeatCount(playerId: string): number;
    /**
     * Gets the current state of the table.
     * @returns The current state of the table.
     */
    getState(): TableState;
    /**
     * Sets the state of the table. Emits TABLE_EVENTS.STATE_UPDATED when the state is updated.
     * @param state - The new state of the table.
     */
    setState(state: TableState): void;
    /**
     * Gets the number of players at the table.
     * @returns The number of players at the table.
     */
    getPlayerCount(): number;
    /**
     * Gets all players at the table.
     * @returns An array of all players at the table.
     */
    getPlayers(): Player[];
    /**
     * Gets a seat at a specific index.
     * @param seatIndex - The index of the seat to get.
     * @returns The seat object or null if the index is invalid.
     */
    getSeat(seatIndex: number): Seat | null;
    /**
     * Gets all seats at the table.
     * @returns An array of all seats at the table.
     */
    getSeats(): Seat[];
    /**
     * Gets the player at a specific seat.
     * @param seatIndex - The index of the seat to get the player from.
     * @returns The player object or null if the seat is invalid.
     */
    getPlayerAtSeat(seatIndex: number): Player | null;
    /**
     * Broadcasts a message to all players at the table.
     * @param message - The message to broadcast.
     */
    broadcastMessage(message: any): void;
    /**
     * Broadcasts the current table state to all players at the table.
     * This includes all game-specific state and is only meant for players at this table.
     * Broadcasts a TABLE_EVENTS.STATE_UPDATED event that can be used by other components.
     */
    broadcastTableState(): void;
    /**
     * Gets the complete table state including all attributes and game state.
     * This is used for players who are at the table and need full information.
     * Emits a TABLE_EVENTS.STATE_UPDATED event that can be used by other components.
     *
     * @returns The complete table state.
     */
    getTableState(): any;
    /**
     * Gets the table metadata for lobby display.
     * This includes only the essential information needed to display in the lobby.
     *
     * @returns The table metadata.
     */
    getTableMetadata(): any;
    /**
     * Sets an attribute on the table. Emits TABLE_EVENTS.ATTRIBUTE_CHANGED when the attribute is updated.
     * @param key - The key of the attribute to set.
     * @param value - The value of the attribute to set.
     */
    setAttribute(key: string, value: any): void;
    /**
     * Gets an attribute from the table.
     * @param key - The key of the attribute to get.
     * @returns The value of the attribute or null if the attribute does not exist.
     */
    getAttribute(key: string): any;
    /**
     * Checks if the table has an attribute.
     * @param key - The key of the attribute to check.
     * @returns True if the attribute exists, false otherwise.
     */
    hasAttribute(key: string): boolean;
    /**
     * Gets all attributes from the table.
     * @returns An object containing all attributes.
     */
    getAttributes(): Record<string, any>;
    /**
     * Sets multiple attributes on the table. Emits TABLE_EVENTS.ATTRIBUTES_CHANGED when any attributes are updated.
     * @param attributes - An object containing key-value pairs of attributes to set.
     * @param broadcast - Whether to broadcast the table state after updating the attributes.
     * @returns True if any attributes were changed, false otherwise.
     */
    setAttributes(attributes: Record<string, any>, broadcast?: boolean): boolean;
    /**
     * Updates the attributes of the table. Emits TABLE_EVENTS.ATTRIBUTES_CHANGED when any attributes are updated.
     * @param attributes - An object containing key-value pairs of attributes to set.
     * @returns True if any attributes were changed, false otherwise.
     */
    updateAttributes(attributes: Record<string, any>): boolean;
    /**
     * Removes an attribute from the table. Emits TABLE_EVENTS.ATTRIBUTE_CHANGED when the attribute is removed.
     * @param key - The key of the attribute to remove.
     */
    removeAttribute(key: string): void;
}
