'use strict';
const GameTurnStages = reqfromroot('Game/GameTurnStages');
class DurakTurnStages extends GameTurnStages{
	/**
	* Класс содержит действия, выполняемые в различные стадии хода.  
	* Выполняется в своем собственном контексте.
	* Визуальное представление хода: https://i.imgur.com/Lje4C0D.png (outdated)
	*/
	constructor(game){
		super(game);
	}
	// Действия
	// Начинаем ход
	DEFAULT(){
		this.game.startTurn();
		// Turn stage: INITIAL_ATTACK
		return true;
	}
	INITIAL_ATTACK(){
		return this.game.let('INITIAL_ATTACK', this.game.players.attackers[0]);
		// Turn stage: ATTACK, ATTACK_DEFENSE
	}
	ATTACK(){
		return this.game.let('ATTACK', this.game.players.attackers[0]);
		// Turn stage: ATTACK, DEFENSE_TRANSFER
	}
	DEFENSE_TRANSFER(){
		return this.game.let('DEFEND', this.game.players.defender, this.game.canTransfer);
		// Turn stage: DEFENSE_TRANSFER, ATTACK_DEFENSE, FOLLOWUP
	}
	ATTACK_DEFENSE(){
		return this.game.let('ATTACK_DEFEND', this.game.players.attackers, this.game.players.defender);
		// Turn stage: ATTACK_DEFENSE, DEFENSE, FOLLOWUP
	}
	DEFENSE(){
		return this.game.let('DEFEND', this.game.players.defender);
		// Turn stage: DEFENSE, FOLLOWUP
	}
	// Подкладывание карт в догонку
	FOLLOWUP(){
		return this.game.let('FOLLOWUP', this.game.players.attackers);
		// Turn stage: FOLLOWUP, END
	}
	TAKE(){
		const game = this.game;
		let action = game.cards.take(game.players.defender);
		this.setNext('END');
		game.players.rolesNotify();
		game.waitForResponse(game.actions.timeouts.take, game.players);
		game.players.takeNotify(action);
		return false;
		// Turn stage: END
	}
	// Начало конца хода, убираем карты со стола
	END(){
		const game = this.game;
		let discarded = game.cards.discard();
		this.setNext('END_DEAL');
		game.players.rolesNotify();
		if(discarded){
			game.waitForResponse(game.actions.timeouts.discard, game.players);
			game.players.completeActionNotify(discarded);
			return false;
		}
		return true;
		// Turn stage: END_DEAL
	}
	// Раздаем карты после окончания хода
	END_DEAL(){
		const game = this.game;
		let dealsOut = game.cards.dealTillFullHand();
		
		this.setNext('ENDED');
		game.players.rolesNotify();
		if(dealsOut.length){
			game.waitForResponse(game.actions.timeouts.deal, game.players);
			game.players.dealNotify(dealsOut);
			return false;
		}
		return true;
		// Turn stage: ENDED
	}
	// Конец конца хода
	// находим следующего игрока, ресетим ход и проверяем, закончилась ли игра
	ENDED(){
		const game = this.game;
		// Если защищающийся брал, сдвигаем айди, по которому будет искаться атакующий
		if(game.actions.takeOccurred){
			game.players.attackers = [game.players.defender];
		}
		let currentAttackerIndex = game.players.findInactive();
		game.resetTurn();
		// Turn stage: null
		if(!game.deck.length && game.players.notEnoughActive){
			game.players.findLoser();
			game.end();
			return false;
		}
		game.players.findToGoNext(currentAttackerIndex);
		return true;
	}
}
module.exports = DurakTurnStages;