<?php

namespace Battles;

use Battles\Database\Db;

class Fight
{
    public static Fight $current;
    private $db;
    private \DateTimeImmutable $timer;
    public const MELEE_ATTACK = 1;
    public const RANGED_ATTACK = 2;
    public const USE_MAGIC = 3;
    public const MOVE = 4;
    public const FLEE = 5;
    public const PASS = 0;
    private int $turn_timeout;

    public function init($fighters)
    {
        $defaultRow = 2;
        $defaultTimer = $this->timer->format('U');
        $query = 'insert into fighters (
                      user_id, 
                      strength, 
                      dexterity, 
                      intuition, 
                      endurance, 
                      intelligence, 
                      wisdom, 
                      accuracy, 
                      evasion, 
                      criticals, 
                      health, 
                      max_health, 
                      mana, 
                      max_mana, 
                      melee_min, 
                      melee_max, 
                      battle_id, 
                      team_id, 
                      row_id, 
                      turn_timeout
                      ) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
        $i = 1;
        $mergedOptions = [];
        foreach ($fighters as $fighter) {
            $statsObj = new UserStats($fighter->user_id);
            $stats = $statsObj->getFullStats();
            $options[$i] = [
                $fighter->user_id,
                $stats->strength,
                $stats->dexterity,
                $stats->intuition,
                $stats->endurance,
                $stats->intelligence,
                $stats->wisdom,
                $stats->accuracy,
                $stats->evasion,
                $stats->criticals,
                $statsObj->getHealth(),
                $statsObj->getMaxHealth(),
                $statsObj->getMana(),
                $statsObj->getMaxMana(),
                $stats->min_physical_damage,
                $stats->max_physical_damage,
                $fighter->fight_id,
                $fighter->team_id,
                $defaultRow,
                $defaultTimer,
            ];
            if ($i > 1) {
                $query .= ', (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
                $mergedOptions = array_merge_recursive($mergedOptions, $options[$i]);
            }
            $i++;
        }
        Db::getInstance()->execute($query, $mergedOptions);
    }

    public function playerTurn(int $action, int $uid): void
    {
        // Перед ходом проверить, а жив ли ты вообще?
        if (empty($this->turn_timeout)) {
            $this->turn_timeout = $this->db->querySingle('select turn_timeout from fighters where uid = ' . $uid);
        }
        $now = date('U');

        /* select from last_turn_time and look at $now_plus_3_minutes - if ok, continue, if no, do nothing */
        if ($now > $this->turn_timeout && !in_array($action, [self::MELEE_ATTACK, self::RANGED_ATTACK, self::USE_MAGIC, self::MOVE, self::PASS, self::FLEE])) {
            $action = self::PASS;
            $stmt_update_timer = $this->db->prepare('update fighters set last_turn_time = ? where uid = ?');
            $stmt_update_timer->bindValue(1, date('U', strtotime('+3 minute')));
            $stmt_update_timer->bindValue(2, $uid);
        }

        if ($action === self::MELEE_ATTACK) {
            //Выполнимо только с клетки 1, только по вражеской клетке 1.
            //Выполнимо по клетке 2, если клетка 1 пуста _у всех сторон_;
            //Выполнимо по клетке 3, если клетка 2 пуста _у всех сторон_;
            //Стоя на клетке 2 при пустой клетке 1 - атака невозможна!
            echo 'Melee!';
        }

        if ($action === self::RANGED_ATTACK) {
            //С клетки 1 атака на вражеские клетки 1 и 2;
            //С клетки 2 атака на свою клетку 1 и вражескую клетку 1;
            //С клетки 2 атака на вражескую 2, только если пустая клетка 1, либо нет клеток 1 _ни у одной из сторон_.
            echo 'Ranged!';
        }

        if ($action === self::USE_MAGIC) {
            //Достаёт кого угодно откуда угодно в любых обстоятельствах.
            //ОЧЕНЬ внимательно проверять цель. Случайный хил трупа вызовёт апокалипсис в логике.
            echo '!MAGIC!';
        }

        if ($action === self::MOVE) {
            //клетка 1 - ближний ряд, только шаг назад
            //клетка 2 - средний ряд, вперёд или назад
            //клетка 3 - тыл, только вперёд
            //В момент хода при соблюдении условий удара может прилететь неблокируемая атака на расстоянии.
            //Перемещение - это ручной гарантированный уворот от всех летящих физических атак.
            //Перемещение на пустующую клетку 1 с клетки 2 - это ручной гарантированный уворот всех стоящих на клетке 2 от всех летящих немагических атак по всей клетке.
            echo 'I have legs!!';
        }
        if ($action === self::FLEE) {
            //побег из боя, только с клетки 3.
            echo 'Help me, mommy!';
        }
        if ($action === self::PASS) {
            //Пропуск хода.
            echo 'I pass this turn.';
        }

        // ПИСАТЬ РЕЗУЛЬТАТ ХОДА ТОЛЬКО ПОСЛЕ ПОВТОРНОЙ ПРОВЕРКИ НА НАЛИЧИЕ ПРОТИВНИКА - ОН МОГ УСПЕТЬ ОТОЙТИ!
        // !!ИЛИ УМЕРЕТЬ!!
        $stmt_update_timer->execute();
    }

}