<?php


class Runes
{
    /** Создаём руну в зависимости от уровня.
     * @param $level
     *
     * @return array
     */
    public static function get($level): array
    {
        if (!in_array($level, [8, 9, 10])) {
            return [];
        }
        $power = [8 => 3, 9 => 3, 10 => 5];
        $stats = [8 => 1, 9 => 3, 10 => 3];
        $rand9 = array_rand(array_flip(['hpAll', 'm2', 'm5']));
        $runes = [
            ['s1', 'pa2', $rand9, 'antm3'],
            ['s1', 'pa3', $rand9, 'za'],
            ['s2', 'pa1', $rand9, 'antm3'],
            ['s2', 'pa1', $rand9, 'm3'],
            ['s3', 'pa4', $rand9, 'm3'],
            ['s5', 'm11', 'mpAll', 'pzm']
        ];
        $vars = [
            's1' => ['Сила', mt_rand(1, $stats[$level])],
            's2' => ['Ловкость', mt_rand(1, $stats[$level])],
            's3' => ['Интуиция', mt_rand(1, $stats[$level])],
            's5' => ['Интеллект', mt_rand(1, $stats[$level])],
            'pa1' => ['Мощности Колющего урона', mt_rand(1, $power[$level])],
            'pa2' => ['Мощности Рубящего урона', mt_rand(1, $power[$level])],
            'pa3' => ['Мощности Дробящего урона', mt_rand(1, $power[$level])],
            'pa4' => ['Мощности Режущего урона', mt_rand(1, $power[$level])],
            'm2' => ['мф. Против Критического Удара', mt_rand(5, 15)],
            'm3' => ['МК', mt_rand(1, 3)],
            'antm3' => ['ПМК', mt_rand(1, 3)],
            'm5' => ['мф. Против Увертывания', mt_rand(5, 10)],
            'm11' => ['Мощности Магии стихии', mt_rand(1, $power[$level])],
            'hpAll' => ['HP', mt_rand(5, 15)],
            'mpAll' => ['MP', mt_rand(10, 20)],
            'pzm' => ['Подавление защиты от магии', 1],
            'za' => ['Защита от Урона', mt_rand(5, 10)],
            'zma' => ['Защита от Магии', mt_rand(5, 10)]
        ];

        $rune = $runes[array_rand($runes)]; // arr (s, pa\m, rand9\mpAll, other)
        $runeTxt = [$vars[$rune[0]][0], $vars[$rune[1]][0], $vars[$rune[2]][0], $vars[$rune[3]][0]];
        $runeVals = [$vars[$rune[0]][1], $vars[$rune[1]][1], $vars[$rune[2]][1], $vars[$rune[3]][1]];
        $resultRune = array_combine($rune, $runeVals);
        $resultText = array_combine($runeTxt, $runeVals);
        if ($level < 10) { // Отрезаем параметр 4.
            array_pop($resultRune);
            array_pop($resultText);
        }
        if ($level < 9) { // Отрезаем параметр 3.
            array_pop($resultRune);
            array_pop($resultText);
        }
        //Строчка data в базу
        $returnData = '|' . http_build_query($resultRune, '', '|');
        $returnData = str_replace('|', '|add_', $returnData);
        //Строчка человекопонятных параметров в статус.
        $returnText =  urldecode(http_build_query($resultText, '', ', '));
        $returnText = 'Характеристики Руны: ' . str_replace('=', ': +', $returnText) . '.';
        return [$returnData, $returnText];
    }

    /** Выкусывает руну из предмета.
     *
     * @param array $itemDataArray
     * data предмета
     *
     * @return array массив, item - предмет, rune - руна из предмета, rune_id - id руны.
     * Оба в подготовленном строчном формате для data
     */
    public static function removeRuneData(array $itemDataArray): array
    {
        # Ищем есть ли в предмете руна определённого типа.
        $runeid = array_search('rune_id', array_flip($itemDataArray));
        if (!in_array($runeid, [6001, 6002, 6003])) {
            return [];
        }
        $bonusArgs = 0;
        # В зависимости от типа руны считаем количество элементов-бонусов.
        if ($runeid === 6001) {
            $bonusArgs = 2;
        }
        if ($runeid === 6002) {
            $bonusArgs = 3;
        }
        if ($runeid === 6003) {
            $bonusArgs = 4;
        }
        $args = 0; //basic rune values - rune, id, name, lvl
        $rune = [];
        $item = [];
        foreach ($itemDataArray as $key => $value) {
            if ($key == 'rune') {
                $args = 4 + $bonusArgs;
            }
            if ($args > 0) {
                $rune[$key] = $value;
                $args--;
                continue;
            }
            $item[$key] = $value;
        }

        unset($rune['rune'], $rune['rune_id'], $rune['rune_name'], $rune['rune_lvl']);

        return [
            'item' => urldecode('|' . http_build_query($item, '', '|')),
            'rune' => urldecode('|' . http_build_query($rune, '', '|')),
            'rune_id' => (int)$runeid
        ];
    }

    public static function checkParts($part1, $part2, $part3, $reputation): array
    {
        $level8 = [10038, 6001];
        $level9 = [10039, 6002];
        $level10 = [10040, 6003];
        if (
            in_array($part1, $level8) &&
            in_array($part2, $level8) &&
            in_array($part3, $level8) &&
            $reputation >= 100
        ) {
            $itm = 6001;
            $runelevel = 8;
            $query = 'update users_achiv set rp = rp + 1 where id = %d';
        } elseif (
            in_array($part1, $level9) &&
            in_array($part2, $level9) &&
            in_array($part3, $level9) &&
            $reputation >= 1000
        ) {
            $itm = 6002;
            $runelevel = 9;
            $query = 'update users_achiv set rn = rn + 1 where id = %d';
        } elseif (
            in_array($part1, $level10) &&
            in_array($part2, $level10) &&
            in_array($part3, $level10) &&
            $reputation >= 1000
        ) {
            $itm = 6003;
            $runelevel = 10;
            $query = 'update users_achiv set rb = rb + 1 where id = %d';
        }

        return empty($itm) || empty($runelevel) || empty($query) ? [] : [
            'rune_id' => $itm,
            'rune_level' => $runelevel,
            'query' => $query
        ];
    }
}