/// <reference types="node" />
import * as http from "http";
import { EventBus } from "../events/EventBus";
import { MessageRouter } from "../events/MessageRouter";
import { Player } from "./Player";
import { GameManager } from "./GameManager";
import { Lobby } from "./Lobby";
import { AuthModule } from "../transport/AuthModule";
import { TableFactory } from "./TableFactory";
export declare class WebSocketManager {
    private wss;
    private eventBus;
    private messageRouter;
    private gameManager;
    private lobby;
    private players;
    private authModule?;
    private disconnectionTimeouts;
    private reconnectionTimeoutMs;
    constructor(server: http.Server, eventBus: EventBus, messageRouter: MessageRouter, gameManager: GameManager, authModule?: AuthModule, reconnectionTimeoutMs?: number, lobby?: Lobby, tableFactory?: TableFactory);
    /**
     * Sets up the connection handler for the WebSocket server.
     * This handler authenticates the connection, creates a new player or reconnects an existing one,
     * and handles incoming messages.
     */
    private setupConnectionHandler;
    /**
     * Sets up event listeners for the WebSocket manager.
     * This listens for lobby state updates and player joined events,
     * and sends the appropriate messages to all players.
     */
    private setupEventListeners;
    /**
     * Sends the initial state to a player.
     * This includes player details and lobby state.
     *
     * @param player The player to send the initial state to.
     */
    private sendInitialState;
    /**
     * Distribute player updates to relevant players.
     * This notifies the player about their own changes and also updates
     * any tables they're part of.
     *
     * @param player The player whose state changed
     * @param key The attribute that changed
     * @param value The new value
     * @param updateTableState Whether to update the table state
     */
    distributePlayerUpdate(player: Player, key: string, value: any, updateTableState?: boolean): void;
    /**
     * Distribute multiple player updates to relevant players.
     *
     * @param player The player whose state changed
     * @param attributes The attributes that changed
     * @param updateTableState Whether to update the table state
     */
    distributePlayerUpdates(player: Player, attributes: Record<string, any>, updateTableState?: boolean): void;
    /**
     * Creates a new player or reconnects an existing one.
     *
     * @param socket The WebSocket connection.
     * @param playerId The player ID.
     * @returns The player object.
     */
    private createOrReconnectPlayer;
    /**
     * Setup disconnect handler for a player to manage reconnection timeout
     *
     * @param player The player to set up disconnect handler for
     */
    private setupPlayerDisconnectHandler;
    /**
     * Permanently remove a player from the game server
     *
     * @param playerId The ID of the player to remove
     */
    private removePlayerPermanently;
    /**
     * Gets a player by their ID.
     *
     * @param playerId The ID of the player to get.
     * @returns The player object or undefined if the player does not exist.
     */
    getPlayer(playerId: string): Player | undefined;
    /**
     * Disconnects a player by their ID without waiting for timeout.
     * This bypasses the reconnection timeout and immediately removes the player.
     *
     * @param playerId The ID of the player to disconnect.
     */
    disconnectPlayer(playerId: string): void;
    /**
     * Gets the current reconnection timeout in milliseconds
     */
    getReconnectionTimeout(): number;
    /**
     * Sets the reconnection timeout in milliseconds
     *
     * @param timeoutMs The timeout in milliseconds (0 to disable reconnection)
     */
    setReconnectionTimeout(timeoutMs: number): void;
    /**
     * Gets information about temporarily disconnected players.
     * This is useful for monitoring and debugging connection issues.
     *
     * @returns Array of objects containing information about disconnected players
     */
    getDisconnectedPlayers(): Array<{
        id: string;
        disconnectedAt: number;
        reconnectionAvailableUntil: number;
        timeLeftMs: number;
    }>;
    /**
     * Gets the current number of connected players.
     *
     * @returns The number of connected players
     */
    getConnectedPlayerCount(): number;
}
