<?php
/**
 * Author: lopiu
 * Date: 06.07.2020
 * Time: 22:41
 */

namespace Battles;

use Battles\Database\DBPDO;

class DressedItems
{
    private $USERID;
    private $dressedItem;
    private static $db;

    /**
     * DressedItems constructor.
     * @param int   $user_id ID игрока.
     */
    public function __construct(int $user_id)
    {
        self::$db = DBPDO::INIT();
        $this->USERID = $user_id;
    }

    public static function getDressedItemBySlot($itemSlot, $ownerId)
    {
        return self::$db->fetch('SELECT * FROM inventory WHERE owner_id = ? AND dressed_slot = ?', [$ownerId, $itemSlot]);
    }

    public function getItemsInSlots()
    {
        $items = self::$db->ofetchALL('SELECT * FROM inventory WHERE owner_id = ? AND dressed_slot > 0', $this->USERID);
        $i = 0;
        while ($i < count($items)) {
            $this->dressedItem[$items[$i]->dressed_slot] = $items;
            $i++;
        }
        return $this->dressedItem;
    }

    private function getBonuses(): array
    {
        $query = <<<SQL
SELECT SUM(add_strength) as sum_strength, 
       SUM(add_dexterity) as sum_dexterity, 
       SUM(add_intuition) as sum_intuition, 
       SUM(add_endurance) as sum_endurance, 
       SUM(add_intelligence) as sum_intelligence, 
       SUM(add_wisdom) as sum_wisdom,
       SUM(add_accuracy) as sum_accuracy,
       SUM(add_evasion) as sum_evasion,
       SUM(add_criticals) as sum_criticals,
       SUM(add_min_physical_damage) as sum_min_phys_damage,
       SUM(add_max_physical_damage) as sum_max_phys_damage
FROM inventory WHERE owner_id = ? AND dressed_slot > 0
SQL;
        return self::$db->fetch($query, $this->USERID);
    }

    public function getStrengthBonus(): ?int
    {
        return self::getBonuses()['sum_strength'];
    }

    public function getDexterityBonus(): ?int
    {
        return self::getBonuses()['sum_dexterity'];
    }

    public function getIntuitionBonus(): ?int
    {
        return self::getBonuses()['sum_intuition'];
    }

    public function getEnduranceBonus(): ?int
    {
        return self::getBonuses()['sum_endurance'];
    }

    public function getIntelliganceBonus(): ?int
    {
        return self::getBonuses()['sum_intelligence'];
    }

    public function getWisdomBonus(): ?int
    {
        return self::getBonuses()['sum_wisdom'];
    }

    public function getAccuracyBonus(): ?int
    {
        return self::getBonuses()['sum_accuracy'] ?? 0;
    }

    public function getEvasionBonus(): ?int
    {
        return self::getBonuses()['sum_evasion'] ?? 0;
    }

    public function getCriticalsBonus(): ?int
    {
        return self::getBonuses()['sum_criticals'] ?? 0;
    }

    public function getMinPhysDamage(): ?int
    {
        return self::getBonuses()['sum_min_phys_damage'];
    }

    public function getMaxPhysDamage(): ?int
    {
        return self::getBonuses()['sum_max_phys_damage'];
    }

    /**
     * Снимает с предмета статус одетого на персонажа в определённом слоте персонажа.
     * @param $slot_id - номер слота.
     */
    public function undressItem($slot_id)
    {
        self::getItemsInSlots();
        // Проверяем, что используется один из 12 слотов и наличие предмета в слоте.
        if (in_array($slot_id, Item::ITEM_TYPES_ALLOWED_IN_SLOTS) && $this->dressedItem[$slot_id]) {
            self::$db->execute('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ? AND owner_id = ?', [$slot_id, $this->USERID]);
        }
    }
}