import { Card } from './Card';
import { Pile } from './Pile';
import { Deck } from './Deck';
import { Player } from './Player';
import { GameAction } from './GameAction';
import type { IGameRepository } from '../repositories/GameRepository';
export declare class Game {
    private readonly _id;
    private readonly _createdAt;
    private _piles;
    private _players;
    private _deck;
    private _currentPlayerId?;
    private _isFinished;
    private _repository;
    private _actions;
    constructor(numberOfPlayers: number, repository?: IGameRepository);
    private _initializeGame;
    get id(): string;
    get piles(): readonly Pile[];
    get players(): readonly Player[];
    get currentPlayerId(): string | undefined;
    get isFinished(): boolean;
    get gameResult(): 'ongoing' | 'won' | 'lost';
    get winnerMessage(): string | null;
    get deck(): Deck;
    get createdAt(): Date;
    private _validateGame;
    private _persist;
    private _recordAction;
    recordAction(action: GameAction): void;
    setRepository(repository: IGameRepository): void;
    removeRepository(): void;
    hasRepository(): boolean;
    hasExternalRepository(): boolean;
    persist(): Promise<void>;
    get actions(): readonly GameAction[];
    getActionsSortedByTimestamp(): readonly GameAction[];
    private _addPlayer;
    getPlayerCards(playerId: string): readonly Card[];
    getPlayer(playerId: string): Player | undefined;
    canPlaceCardOnPile(cardValue: number, pileNumber: number): boolean;
    moveCardToPile(playerId: string, cardValue: number, pileNumber: number): Promise<void>;
    private _checkGameEnd;
    private _checkVictory;
    private _checkDefeat;
    checkForImmediateDefeat(): boolean;
    forceDefeatCheck(): Promise<void>;
    restart(): Promise<void>;
    private _canPlayerPlayAnyCard;
    private _canPlayerPlayRequiredCards;
    private _getPlayableCards;
    private _findNextPlayablePlayer;
    private _autoDrawCardsForPlayer;
    canPlayerEndTurn(playerId: string): boolean;
    getRequiredCardsToPlay(playerId: string): number;
    private _getCardsPlayedThisTurn;
    nextTurn(): Promise<void>;
    private _handleNextPlayerValidation;
    equals(other: Game): boolean;
    toString(): string;
    toJSON(): {
        id: string;
        createdAt: string;
        piles: Array<{
            number: number;
            direction: string;
            lastCard: {
                value: number;
                id?: string;
            };
            id?: string;
        }>;
        players: Array<{
            id: string;
            name: string;
            cards: Array<{
                value: number;
                id?: string;
            }>;
            isCurrentTurn: boolean;
        }>;
        deck: {
            cards: Array<{
                value: number;
                id?: string;
            }>;
            id?: string;
        };
        currentPlayerId?: string;
        isFinished: boolean;
        gameResult: 'ongoing' | 'won' | 'lost';
        winnerMessage?: string;
        actions: Array<{
            id: string;
            gameId: string;
            type: string;
            description: string;
            playerId?: string | undefined;
            playerName?: string | undefined;
            cardValue?: number | undefined;
            pileNumber?: number | undefined;
            timestamp: string;
        }>;
    };
    static fromJSON(data: {
        id: string;
        createdAt: string;
        piles: Array<{
            number: number;
            direction: string;
            lastCard: {
                value: number;
                id?: string;
            };
            id?: string;
        }>;
        players: Array<{
            id: string;
            name: string;
            cards: Array<{
                value: number;
                id?: string;
            }>;
            isCurrentTurn: boolean;
        }>;
        deck: {
            cards: Array<{
                value: number;
                id?: string;
            }>;
            id?: string;
        };
        currentPlayerId?: string;
        isFinished: boolean;
        gameResult?: 'ongoing' | 'won' | 'lost';
        winnerMessage?: string;
        actions?: Array<{
            id: string;
            gameId: string;
            type: string;
            description: string;
            playerId?: string | undefined;
            playerName?: string | undefined;
            cardValue?: number | undefined;
            pileNumber?: number | undefined;
            timestamp: string;
        }>;
    }, repository?: IGameRepository): Game;
}
//# sourceMappingURL=Game.d.ts.map