<?php
/** todo
 * В каком-то месте проверять по крону не протух ли турнир!
 */

namespace Insallah;

class Tournament
{
    /**
     * Проверяем может ли игрок учавствовать в турнире и либо присоединяем его, либо обламываем.
     *
     * @param int $user_id
     *
     * @return void
     */
    public function join($user_id)
    {
        /** Возвращает level, или 0 если провалены проверки. */
        $userLevel = TournamentModel::getUserLevel($user_id);
        if ($userLevel === 0) {
            return;
        }

        $mq = TournamentModel::getWaitingMembersQuantity($userLevel);
        if (empty($mq)) {
            TournamentModel::createTournament($userLevel);
        }

        TournamentModel::joinTournament($user_id, $userLevel);

        /** На третьем участнике пишем уведомление в чат. */
        if ($mq === 2) {
            TournamentModel::sysMessage("Внимание! Идёт набор бойцов на турнир " . $userLevel . " уровня! Поспешите!");
        }

        /** На двенадцатом участнике начинаем турнир. */
        if ($mq === 11) {
            TournamentModel::startTournament($userLevel);
            $this->check_members($userLevel);
        }
    }

    /**
     * Проверяем есть ли ещё участники турнира. Если есть, отправляем драться. Если остался последний - значит он
     * победитель.
     * todo Обработать ничью!
     *
     * @param int $tournament_id
     *
     * @return void
     */
    private function check_members($tournament_id)
    {
        $active_fighters = TournamentModel::getFreeFighters($tournament_id);
        if (count($active_fighters) > 1) {
            $this->start_battle($active_fighters);
        } else {
            TournamentModel::removeFighter($active_fighters[0]); // выбиваем победителя
            $this->victory($tournament_id);
        }
    }

    /**
     * Получаем пары бойцов и начинаем их поединки.
     *
     * @param array $fighters_list
     *
     * @return void
     */
    private function start_battle(array $fighters_list)
    {
        $teams = TournamentModel::getFightersTeams($fighters_list);
        foreach ($teams as $team) {
            if (count($team) === 2) {
                TournamentModel::startBattle($team[0], $team[1]);
            }
        }
    }

    /**
     * Вызывается при проигрыше боя или при уходе в оффлайн.
     *
     * @param int $user_id
     *
     * @return void
     */
    public function kick_user($user_id)
    {
        if (empty($user_id)) {
            return;
        }
        TournamentModel::removeFighter($user_id);
        $this->check_members(TournamentModel::getTournamentIdByUserId($user_id)); //перезапуск выбора противника для поединка
    }

    /**
     * Награждаем победителей турнира, чистим базу.
     *
     * @param int $tournament_id
     *
     * @return void
     */
    private function victory($tournament_id)
    {
        $winners = TournamentModel::getWinners($tournament_id);
        TournamentModel::destroyTournament($tournament_id);
        TournamentModel::givePrizeItems($winners[1], 25);
        TournamentModel::givePrizeItems($winners[2], 10);
        TournamentModel::givePrizeItems($winners[3], 5);
    }
}