import { getRandomInt } from "./common";
import { Fridge, Opinator, SmartMonday, CleanupHS } from "./games";
import { GameResultDisplay, AnnounceNextGameDisplay } from "./ui";

/**
 * manages the game lifecyle, starting a game, handeling game end and starting a new one
 * lvl up etc.
 */
export class GameManager {
    constructor(app, gameContainter) {
        this._app = app;
        this._gameContainer = gameContainter;
        this._difficulty = 1;
        this.gameResultTime = 2500; // milliseconds
        this.nextGameAnnounceTime = 2000; // ...

        const opinator = new Opinator(app.ticker);
        const fridge = new Fridge(app.ticker);
        const smartMonday = new SmartMonday(app.ticker);
        const cleanupHS = new CleanupHS(
            app.stage.width,
            app.stage.height,
            app.ticker,
        );

        this._games = [opinator, fridge, smartMonday, cleanupHS];

        this._playedGamesIds = [];
        this._unPlayedGamesIds = [];
        for (var i = 0; i < this._games.length; i++) {
            this._unPlayedGamesIds.push(i);
        }
        this._currentGame = undefined;

        // in between game display
        this._resultScreen = new GameResultDisplay();
        this._nextGameAnnounceScreen = new AnnounceNextGameDisplay();

        this._gameContainer.addChild(this._resultScreen.node);
        this._gameContainer.addChild(this._nextGameAnnounceScreen.node);
        this._resultScreen.node.visible = false;
        this._nextGameAnnounceScreen.node.visible = false;
    }

    start() {
        this.nextGame();
    }

    nextGame() {
        const unplayedLength = this._unPlayedGamesIds.length;
        if (unplayedLength == 0) {
            console.log("level up");
            this._difficulty += 1;
            this._unPlayedGamesIds = this._playedGamesIds;
            this._playedGamesIds = [];
        }

        const nextIndex = getRandomInt(unplayedLength);
        const nextId = this._unPlayedGamesIds[nextIndex];
        console.log(nextIndex, this._playedGamesIds, this._unPlayedGamesIds);
        this._playedGamesIds.push(this._unPlayedGamesIds[nextIndex]);
        this._unPlayedGamesIds.splice(nextIndex, 1);
        this._currentGame = this._games[nextId];
        this._currentGame.onEnd = (status) => {
            this._onGameEnd(status);
        };
        this._gameContainer.addChild(this._currentGame.gameContainer);
        this._currentGame.start();
    }

    _onGameEnd(status) {
        console.log("game end", status);
        this._gameContainer.removeChild(this._currentGame.gameContainer);

        this._resultScreen.setStatus(status);
        this._resultScreen.node.visible = true;
        setTimeout(() => {
            this._resultScreen.node.visible = false;
            this._nextGameAnnounceScreen.node.visible = true;
        }, this.gameResultTime);

        setTimeout(() => {
            this._nextGameAnnounceScreen.node.visible = false;
            console.log("starting next game");
            this.nextGame();
        }, this.gameResultTime + this.nextGameAnnounceTime);
    }
}
