<?php

use Core\Db;
use User\ItemsModel;

class BotLogic
{

    public static array $bot = [];
    public static array $st = [];
    private static array $btl = [];
    private static array $enemy = [];
    private static array $pr = [];

    public static function inuser_go_btl($id, $txt = '')
    {
        if (isset($id['id'])) {
            $ctx = stream_context_create(['https' => ['timeout' => 30]]);
            $val = file_get_contents('/jx/battle/refresh_bot.php?uid=' . $id['id'] . '&cron_core=' . md5($id['id'] . '_brfCOreW@!_' . $id['pass']) . '&pass=' . $id['pass'] . '&' . $txt, false, $ctx);
            echo '[' . $val . ']<hr>';

        }
    }

    private static function useBattlePriems(): void
    {
        //используем приемы в бою
        if (self::$st['hpNow'] <= 0 || self::$bot['battle'] <= 0) {
            return;
        }
        $pr = explode('|', self::$bot['priems']);
        $rz = explode('|', self::$bot['priems_z']);
        $i = 0;
        while ($i < count($pr)) {
            if ($pr[$i] > 0) {
                self::$pr[$pr[$i]] = $rz[$i];
            }
            $i++;
        }
        $i = 0;
        while ($i < count($pr)) {
            if ($rz[$i] < 1 && $pr[$i] > 0) {
                //Можно использовать прием, подключаем логику
                BotPriemLogic::start($i, $pr[$i]);
            }
            $i++;
        }
        self::$pr = [];
    }

    /** Удаление данных бота из БД.
     * @return void
     */
    private static function clearBot(): void
    {
        //Удаляем сообщения в чате
        Db::sql('delete from chat where `to` = ?', [self::$bot['login']]);
        //Удаляем шмотки и эффекты
        Db::sql('delete from items_users where uid = ?', [self::$bot['login']]);
        Db::sql('delete from eff_users where uid = ?', [self::$bot['login']]);
        //Удаляем статы и поле в юзерс
        Db::sql('delete from users where id = ?', [self::$bot['login']]);
        Db::sql('delete from stats where id = ?', [self::$bot['login']]);
        Db::sql('delete from online where uid = ?', [self::$bot['login']]);
        Db::sql('delete from actions where uid = ?', [self::$bot['login']]);
    }

    //Действия бота вне боя
    static function actions()
    {

        global $u;

        if (self::$bot['battle'] == 0 && self::$bot['zv'] == 0 && self::$bot['pass'] == 'saintlucia') {

            //Можно: сменить фулл, перейти в другую комнату, входить наймом, делать бафы

            //Переходим в другую комнату
            if (true == false && self::$bot['a1'] != 0 && self::$bot['a1'] != self::$bot['room']) {

                self::_loc(self::$bot['a1']);

            } else {

                self::update('a1', 0);

                //CAPITAL
                if (!in_array(self::$bot['room'], [0, 2, 4, 5, 7, 377])) {

                    if (self::$bot['exp'] > 400000 && self::$bot['level'] == 8) {
                        self::$bot['exp'] = 400000;
                        mysql_query('UPDATE `stats` SET `exp` = "400000" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                    } elseif (self::$bot['exp'] > 3500000 && self::$bot['level'] == 9) {
                        self::$bot['exp'] = 3500000;
                        mysql_query('UPDATE `stats` SET `exp` = "3500000" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                    }

                    //Действие в комнате
                    //Магазин
                    //Покупаем кристалл вечности
                    if (self::$bot['room'] == 10 && self::$bot['level'] == 5 && self::$bot['exp'] >= 12499) {
                        $cr = mysql_fetch_array(mysql_query('SELECT `id` FROM `items_users` WHERE `item_id` = "1204" AND `uid` = "' . self::$bot['id'] . '" AND `delete` = "0" LIMIT 1'));
                        if (!isset($cr['id'])) {
                            //Покупаем кристалл
                            ItemsModel::addItem(1204, self::$bot['id']);
                        }
                    }
                    //Переходим в комнату для сражений
                    self::_loc(self::_loc_zv());
                }
            }

            //Если бот уже набрал опыт для перехода на 6-ой
            if (self::$bot['level'] == 5 && self::$bot['exp'] >= 12499) {
                $cr = mysql_fetch_array(mysql_query('SELECT `id` FROM `items_users` WHERE `item_id` = "1204" AND `uid` = "' . self::$bot['id'] . '" AND `delete` = "0" LIMIT 1'));
                if (!isset($cr['id'])) {
                    self::update('a1', 10);
                }
            }

            //Похоже что боту пора сменить комплект ))
            if (self::$bot['clss'] == 0) {

                //Выбираем новый класс и шмотки :)

                //Меняем класс
                self::$bot['clss'] = rand(1, 4);

                $x = mysql_fetch_array(mysql_query('SELECT COUNT(*) FROM `a_bot_tree` WHERE `level` = "' . (self::$bot['level']) . '" '));

                if ($x[0] > 0) {

                    if ($x[0] > 1) {

                        $x = rand(1, $x[0]);
                        //выбираем 1 из нескольких
                        $da = ['ASC', 'DESC', 'DESC', 'ASC'];
                        $da = $da[rand(0, 5)];
                        $com = mysql_fetch_array(mysql_query('SELECT * FROM `a_bot_tree` WHERE `level` = "' . (self::$bot['level']) . '" ORDER BY `id` ' . $da . ' LIMIT ' . ($x - 1) . ',1'));
                    } else {
                        $com = mysql_fetch_array(mysql_query('SELECT * FROM `a_bot_tree` WHERE `level` = "' . (self::$bot['level']) . '" LIMIT 1'));
                    }

                    if (!isset($com['id'])) {

                        $com = mysql_fetch_array(mysql_query('SELECT * FROM `a_bot_tree` WHERE `level` < "' . (self::$bot['level']) . '" ORDER BY `id` DESC LIMIT 1'));

                    }

                    if (isset($com['id'])) {

                        mysql_query('UPDATE `users` SET `clss` = "' . self::$bot['clss'] . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');

                        /* Забираем старые шмотки и эффекты */
                        mysql_query('UPDATE `items_users` SET `delete` = "' . time() . '" WHERE `gift` = "" AND `item_id` != "1204" AND `uid` = "' . self::$bot['id'] . '" AND `delete` = "0"');
                        mysql_query('UPDATE `items_users` SET `iznosNOW` = "0" WHERE `uid` = "' . self::$bot['id'] . '" AND `delete` = "0"');
                        mysql_query('UPDATE `eff_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . self::$bot['id'] . '" AND `delete` = "0"');

                        /* Обновляем статы и приемы */

                        if ($com['pr'] == '') {
                            $i = 1;
                            while ($i <= 18) {
                                $com['pr'] .= $com['p' . $i] . '|';
                                $i++;
                            }
                            $com['pr'] .= '0';
                        }

                        mysql_query('UPDATE `stats` SET `stats` = "' . $com['stats'] . '",`priems` = "' . $com['pr'] . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');

                        $i = 1;
                        while ($i <= 20) {
                            if ($com['e' . $i] > 0) {
                                //Выдаем и надеваем предмет
                                //$it = \User\ItemsModel::addItem($com['e'.$i],self::$bot['id']);
                                $eff = mysql_fetch_array(mysql_query('SELECT * FROM `eff_main` WHERE `id2` = "' . $com['e' . $i] . '" LIMIT 1'));
                                mysql_query(
                                    'INSERT INTO `eff_users` (`overType`,`id_eff`,`uid`,`name`,`timeUse`,`data`,`no_Ace`) VALUES ("' . $eff['oneType'] . '","' . $eff['id2'] . '","' . self::$bot['id'] . '","' . $eff['mname'] . '","' . (time(
                                        ) + 9640000) . '","' . $eff['mdata'] . '","' . $eff['noAce'] . '")'
                                );
                            }
                            $i++;
                        }

                        $i = 1;
                        while ($i <= 20) {
                            if ($com['w' . $i] > 0) {
                                //Выдаем и надеваем предмет
                                $it = ItemsModel::addItem($com['w' . $i], self::$bot['id']);
                                $eff1 = mysql_fetch_array(mysql_query('SELECT * FROM `items_shop` WHERE `item_id` = "' . $com['w' . $i] . '" LIMIT 1'));
                                if ($it > 0) {
                                    mysql_query(
                                        'UPDATE `items_users` SET `inOdet` = "' . $i . '",`delete` = "0", `1price` = "' . $eff1['price_1'] . '" WHERE `uid` = "' . self::$bot['id'] . '" AND `id` = "' . $it . '" LIMIT 1'
                                    );
                                }
                            }
                            $i++;
                        }
                    }
                }
            }

            //если бот уже 1-ый уровень, а сидит в новичках :) кидаем его в залы
            if (self::$bot['city'] == 'capitalcity' && self::$bot['level'] < 2 && self::$bot['room'] == 0 && self::$bot['a1'] == 0) {
                self::_loc(self::_loc_zv());
            }
        }
    }

    private static bool $botInit = false;

    //Включаем логику бота
    static function start($id): bool
    {
        if (!self::$botInit) {
            return self::$botInit;
        }

        global $u;
        self::$bot = $u::getInfo($id);

        if (!isset(self::$bot['id'])) {
            return self::$botInit;
        }

        self::$botInit = true;

        self::$st = $u->getStats(self::$bot, 0);

        //Заходим ботом в онлайн
        self::_online();

        if (self::$bot['battle'] > 0) {

            //Действия бота в поединке
            self::$btl = mysql_fetch_array(mysql_query('SELECT * FROM `battle` WHERE `id` = "' . mysql_real_escape_string(self::$bot['battle']) . '" AND `team_win` = "-1" LIMIT 1'));
            if (isset(self::$btl['id'])) {

                $go_bot = false;
                $go_txt = '';

                $a1 = mysql_fetch_array(
                    mysql_query(
                        'SELECT `id`,`uid1`,`uid2`,`time` FROM `battle_act` WHERE `battle` = "' . self::$btl['id'] . '" AND `uid1` = "' . self::$bot['id'] . '" ORDER BY `time` ASC LIMIT 1'
                    )
                );

                //Проверяем возможность использования приемов и делаем список что использовать
                //используем приемы
                self::useBattlePriems();

                //Бот сделал удар, но никто не ответил, проверяем таймаут и если что заходим
                if (isset($a1['id']) && $a1['time'] + self::$btl['timeout'] < time()) {
                    $go_bot = true;
                }

                //ТУТ test
                $a2 = mysql_fetch_array(
                    mysql_query(
                        'SELECT `id`,`uid1`,`uid2`,`time` FROM `battle_act` WHERE `battle` = "' . self::$btl['id'] . '" AND `uid2` = "' . self::$bot['id'] . '" ORDER BY `time` ASC LIMIT 1'
                    )
                );
                if (isset($a2['uid1'])) {
                    mysql_query('UPDATE `stats` SET `enemy` = "' . $a2['uid1'] . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                }
                $a3 = mysql_fetch_array(
                    mysql_query(
                        'SELECT `id`,`uid1`,`uid2`,`time` FROM `battle_act` WHERE `battle` = "' . self::$btl['id'] . '" AND `uid2` = "' . self::$bot['id'] . '" ORDER BY `time` ASC LIMIT 1'
                    )
                );
                if (isset($a3['uid2'])) {
                    mysql_query('UPDATE `stats` SET `enemy` = "' . $a3['uid2'] . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                }
                //Размен с противником


                self::$enemy = mysql_fetch_array(mysql_query('SELECT * FROM `stats` WHERE `id` = "' . self::$bot['enemy'] . '" LIMIT 1'));

            } else {

                //Заходим на персонажа
                self::inuser_go_btl(self::$bot);

                //Поединок уже завершился, выкидываем из боя
                self::$bot['battle'] = 0;
                mysql_query('UPDATE `users` SET `battle` = "' . self::$bot['battle'] . '" WHERE `id` = "' . mysql_real_escape_string(self::$bot['id']) . '" LIMIT 1 ');
            }

        } else {

            //Действия бота вне поединка
            if (self::$bot['timeMain'] < time()) {

                mysql_query('UPDATE `chat` SET `time` = "' . time() . '" WHERE `to` = "' . self::$bot['login'] . '" AND `time` = "-1"');

                //Действие возможно произвести
                if (self::$bot['ipreg'] == 1 || self::$bot['ipreg'] == 2 || self::$bot['ipreg'] == 4) {
                    //Принимаем только хаоты
                    self::$bot['ipreg'] = 3;
                }
                if (self::$bot['ipreg'] == 5) {
                    //Подаем только хаоты
                    self::$bot['ipreg'] = 7;
                }
                //
                if (self::$bot['ipreg'] == 0 || !in_array(self::$bot['room'], [0, 2, 4, 5, 7, 377]))  {

                    //Обновляем эффекты
                    $com = mysql_fetch_array(mysql_query('SELECT * FROM `a_bot_tree` WHERE `level` = "' . (self::$bot['level']) . '" LIMIT 1'));
                    if (isset($com['id'])) {
                        $eft = mysql_fetch_array(mysql_query('SELECT `id` FROM `eff_users` WHERE `uid` = "' . self::$bot['id'] . '" AND `delete` = "0" LIMIT 1'));
                        if (!isset($eft['id'])) {
                            mysql_query('UPDATE `eff_users` SET `delete` = "' . time() . '" WHERE `uid` = "' . self::$bot['id'] . '" AND `delete` = "0"');
                            $i = 1;
                            while ($i <= 20) {
                                if ($com['e' . $i] > 0) {
                                    //Выдаем и надеваем предмет
                                    //$it = \User\ItemsModel::addItem($com['e'.$i],self::$bot['id']);
                                    $eff = mysql_fetch_array(mysql_query('SELECT * FROM `eff_main` WHERE `id2` = "' . $com['e' . $i] . '" LIMIT 1'));
                                    mysql_query(
                                        'INSERT INTO `eff_users` (`overType`,`id_eff`,`uid`,`name`,`timeUse`,`data`,`no_Ace`) VALUES ("' . $eff['oneType'] . '","' . $eff['id2'] . '","' . self::$bot['id'] . '","' . $eff['mname'] . '","' . (time(
                                            ) + 86400 * 7) . '","' . $eff['mdata'] . '","' . $eff['noAce'] . '")'
                                    );
                                }
                                $i++;
                            }
                        }
                    }

                    if (self::$bot['level'] >= 13 && self::$bot['clan'] == 0 && self::$bot['align'] == 0) {
                        //обнуляем бота
                        self::clearBot();
                    }

                    //Только-что из поединка, хиляется
                    if (!in_array(self::$bot['room'], [0, 2, 4, 5, 7, 377])) {

                        //В какой-то локации, видимо что-то делаем

                    } elseif (self::$st['hpNow'] >= self::$st['hpAll']) {
                        echo 1;
                        //Приступаем к активной деятельности :)
                        mysql_query(
                            'UPDATE `stats` SET `zv`= "0",`team`= "0",`hpNow` = "' . self::$st['hpNow'] . '",`mpNow` = "' . self::$st['mpNow'] . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1'
                        );
                        mysql_query('UPDATE `users` SET `ipreg` = "' . self::new_action() . '",`mod_zvanie` = "Стажер" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');

                    } else {

                        if (self::$bot['mod_zvanie'] == 'Стажер100500') {
                            //Надеваем комплект + обновляем эффекты
                            mysql_query(
                                'UPDATE `eff_users` SET `timeUse` = "' . (time() + 7200) . '" WHERE `uid` = "' . self::$bot['id'] . '" AND `delete` = "0" AND `v1` != "priem" LIMIT 12'
                            );
                            mysql_query('UPDATE `items_users` SET `inOdet` = "0" WHERE `uid` = "' . self::$bot['id'] . '" AND `inOdet` > 0 AND `delete` = "0"');
                            $sp = mysql_query(
                                'SELECT `u`.`id`,`st`.`inslot`,`st`.`2too` FROM `items_users` AS `u` LEFT JOIN `items_main` AS `st` ON `st`.`id` = `u`.`item_id` WHERE `u`.`inOdet` = 0 AND `st`.`inslot` > 0 AND `st`.`inSlot` <= 20'
                            );
                            $in = [];
                            while ($pl = mysql_fetch_array($sp)) {
                                $od = $pl['inslot'];

                                if ($od == 10 && $in[10] > 0) {
                                    if ($in[11] > 0) {
                                        if ($in[12] == 0) {
                                            $od = 12;
                                        }
                                    } else {
                                        $od = 11;
                                    }
                                }

                                if ($od == 3 && $in[3] > 0 && $pl['2too'] > 0) {
                                    if ($in[14] > 0) {
                                        mysql_query('UPDATE `items_users` SET `inOdet` = "0" WHERE `uid` = "' . self::$bot['id'] . '" AND `inOdet` = "14" AND `delete` = "0" LIMIT 1');
                                        $in[14] = 0;
                                    }
                                    $od = 14;
                                }

                                if ($in[$od] == 0) {
                                    $in[$od] = $pl['id'];
                                    mysql_query('UPDATE `items_users` SET `inOdet` = "' . $od . '" WHERE `id` = "' . $pl['id'] . '" AND `uid` = "' . self::$bot['id'] . '" LIMIT 1');
                                }
                            }
                            mysql_query('UPDATE `items_users` SET `mod_zvanie` = "Cтaжер" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                        }

                        //Хиляемся дальше
                        if (self::$bot['regHP'] == 0 || self::$bot['regMP'] == 0) {
                            mysql_query(
                                'UPDATE `stats` SET `regHP` = "' . time() . '", `regMP` = "' . time(
                                ) . '",`hpNow` = "' . self::$st['hpNow'] . '",`mpNow` = "' . self::$st['mpNow'] . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1'
                            );
                        }

                        $reg = $u->regen(self::$bot['id'], self::$st, 0);
                    }

                    self::actions();

                    self::update('timeMain', self::rnd());

                } elseif (self::$bot['ipreg'] == 1) {

                    //Принять заявку на бой (физ.)
                    if (self::$bot['zv'] == 0) {

                        //Выделяем подходящую заявку в физ. поединке
                        $rz = 2;
                        $zv = 0;
                        $nozv = 0;

                        if (self::$bot['level'] == 0) {
                            $rz = 1;
                        }

                        $zv = mysql_fetch_array(
                            mysql_query(
                                'SELECT * FROM `zayvki` WHERE `city` = "' . self::$bot['city'] . '" AND `otk` < "' . rand(2, 6) . '" AND `time` < "' . (time() - rand(
                                        15, 25
                                    )) . '" AND `bcs` < "' . time() . '" AND `start` = "0" AND `razdel` = "' . $rz . '" AND `cancel` = "0" AND `time` > "' . (time(
                                    ) - 1111) . '" AND `money3` = 0 ORDER BY `time` DESC  LIMIT 1'
                            )
                        );

                        if (isset($zv['id'])) {

                            $uz1 = mysql_fetch_array(
                                mysql_query(
                                    'SELECT `u`.`sex`,`u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zv['id'] . '" AND `st`.`team`="1" LIMIT 1'
                                )
                            );
                            $uz2 = mysql_fetch_array(
                                mysql_query(
                                    'SELECT `u`.`sex`,`u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zv['id'] . '" AND `st`.`team`="2" LIMIT 1'
                                )
                            );

                            if (isset($uz1['id']) && !isset($uz2['id'])) {

                                $uz1st = $u->getStats($uz1, 0);

                                if ($uz1st['reting'] <= floor(self::$st['reting'] * 1.27)) {

                                    //Принимаем заявку
                                    $sa = '';
                                    if (self::$bot['sex'] == 2) {
                                        $sa = 'а';
                                    }

                                    $text = ' [login:' . self::$bot['login'] . '] принял' . $sa . ' вашу заявку на бой.[reflesh_main_zv_priem:' . self::$bot['id'] . ']';
                                    $chatMessageDto = new ChatMessage();
                                    $chatMessageDto->setCity($uz1['city']);
                                    $chatMessageDto->setTo($uz1['login']);
                                    $chatMessageDto->setText($text);
                                    $chatMessageDto->setType(6);
                                    $chat = new Chat();
                                    $chat->sendMsg($chatMessageDto);

                                    mysql_query('UPDATE `stats` SET `zv` = "' . $zv['id'] . '",`team` = "2" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                                    mysql_query('UPDATE `users` SET `ipreg` = "8",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');

                                } else {
                                    $nozv = 1;
                                }

                                unset ($uz1st);

                            } else {
                                $nozv = 1;
                            }
                        } else {
                            $nozv = 1;
                        }

                        if ($nozv == 1 && self::$bot['timeMain'] < time() - rand(1, 3) * 60) {
                            mysql_query('UPDATE `users` SET `ipreg` = "0",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                        }

                        unset($rz);
                    }


                } elseif (self::$bot['ipreg'] == 2) {

                    //Принять заявку на бой (груп.)
                    self::bot_group_haot_zv(6);
                } elseif (self::$bot['ipreg'] == 3) {

                    //Принять заявку на бой (хаот.)
                    self::bot_group_haot_zv(7);
                } elseif (self::$bot['ipreg'] == 4) {

                    //Принять заявку на бой (турнир.)
                    self::e('' . self::$bot['login'] . ', я хочу принять турнир...');
                } elseif (self::$bot['ipreg'] == 5) {

                    //Подать заявку (физ.)
                    if (self::$bot['zv'] == 0) {

                        $rz = 2;
                        if (self::$bot['level'] == 0) {
                            $rz = 1;
                        }

                        $ins = mysql_query(
                            'INSERT INTO `zayvki` (`bot1`,`bot2`,`time`,`city`,`creator`,`type`,`time_start`,`timeout`,`min_lvl_1`,`min_lvl_2`,`max_lvl_1`,`max_lvl_2`,`tm1max`,`tm2max`,`travmaChance`,`invise`,`razdel`,`comment`,`money`,`withUser`,`tm1`,`tm2`) VALUES (
                                                                    "0",
                                                                    "0",
                                                                    "' . time() . '",
                                                                    "' . self::$bot['city'] . '",
                                                                    "' . self::$bot['id'] . '",
                                                                    "0",
                                                                    "0",
                                                                    "300",
                                                                    "0",
                                                                    "21",															
                                                                    "0",
                                                                    "21",
                                                                    "1",
                                                                    "1",
                                                                    "0",
                                                                    "0",
                                                                    "' . $rz . '",
                                                                    "",
                                                                    "",
                                                                    "","' . (0 + self::$bot['reting']) . '","0")'
                        );
                        $zid = mysql_insert_id();
                        mysql_query('UPDATE `stats` SET `zv` = "' . $zid . '", `team` = "1" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                        mysql_query('UPDATE `users` SET `ipreg` = "8",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                    }

                } elseif (self::$bot['ipreg'] == 6 || self::$bot['ipreg'] == 7) {

                    self::bot_group_haot_zv(self::$bot['ipreg']);

                    if (self::$bot['zv'] == 0) {

                        $rz = 5;

                        $zv_c = [

                            'time_start' => (60 * 5), 'tm1' => rand(2, 6), 'tm2' => rand(2, 6), 'l1min' => 0, 'l1max' => 21, 'l2min' => 0, 'l2max' => 21, 'timeout' => (60 * rand(1, 3)),

                        ];

                        if (self::$bot['ipreg'] == 7) {
                            $zv_c['tm1'] = 99;
                        }

                        $zv_c['tm2'] = $zv_c['tm1'];
                        $zv_c['l1min'] = self::$bot['level'];
                        $zv_c['l1max'] = self::$bot['level'];

                        if ($zv_c['l1min'] < 2) {
                            $zv_c['l1min'] = 2;
                        }
                        if ($zv_c['l1max'] > 21) {
                            $zv_c['l1max'] = 21;
                        }

                        $zv_c['l2min'] = $zv_c['l1min'];
                        $zv_c['l2max'] = $zv_c['l1max'];

                    }

                } elseif (self::$bot['ipreg'] == 8) {

                    //Ожидание начала поединка
                    if (self::$bot['zv'] == 0) {

                        //Поединок не удалось начать
                        mysql_query('UPDATE `users` SET `ipreg` = "0",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                    } else {
                        $zv = mysql_fetch_array(mysql_query('SELECT * FROM `zayvki` WHERE `id` = "' . self::$bot['zv'] . '" AND `cancel` = "0" AND `start` = "0" LIMIT 1'));

                        if (!isset($zv['id'])) {

                            //Обнуляем действия
                            mysql_query('UPDATE `users` SET `ipreg` = "0",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');

                        } elseif ($zv['razdel'] == 4 || $zv['razdel'] == 5) {

                            //хаот или группа
                            if ($zv['time_start'] + $zv['time'] <= time()) {
                                file_get_contents(
                                    '/main_bot.php?zayvka=1&r=4&uid=' . self::$bot['id'] .
                                    '&cron_core=' . md5(self::$bot['id'] . '_brfCOreW@!_' . self::$bot['pass']) . '&pass=' . self::$bot['pass'] . '&',
                                    false,
                                    stream_context_create(['https' => ['timeout' => 1]])
                                );
                            }

                        } else {
                            //физ
                            if ($zv['creator'] == self::$bot['id']) {

                                $uz2 = mysql_fetch_array(
                                    mysql_query(
                                        'SELECT `u`.`sex`,`u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zv['id'] . '" AND `st`.`team`="2" LIMIT 1'
                                    )
                                );
                                if (isset($uz2['id'])) {
                                    //Заявку кто-то принял, реагируем! :)
                                    $pr = -1;

                                    $uz2st = $u->getStats($uz2, 0);

                                    //btl-cof
                                    if ($uz2st['reting'] > floor(self::$st['reting'] * 1.27)) {

                                        //Отказываем, в 95% случаев, противник слишком силен
                                        if (rand(0, 100) > 95) {
                                            //отправляем бота на избиение :D
                                            $pr = 1;
                                        } else {
                                            //отказ
                                            $pr = 0;
                                        }

                                    } else {
                                        $pr = 1;
                                    }

                                    //Можно принять заявку
                                    //$pr = 0;

                                    if ($pr == 1) {

                                        //Прием заявки
                                        //создаем поединок с ботом
                                        $expB = 0;
                                        $btl = ['players' => '', 'timeout' => $zv['timeout'], 'type' => $zv['type'], 'invis' => $zv['invis'], 'noinc' => 0, 'travmChance' => 0, 'typeBattle' => 0, 'addExp' => $expB, 'money' => 0];
                                        $ins = mysql_query(
                                            'INSERT INTO `battle` (`time_over`,`city`,`time_start`,`players`,`timeout`,`type`,`invis`,`noinc`,`travmChance`,`typeBattle`,`addExp`,`money`,`team_win`) VALUES (
                                                                                "0",
                                                                                "' . self::$bot['city'] . '",
                                                                                "' . time() . '",
                                                                                "' . $btl['players'] . '",
                                                                                "' . $btl['timeout'] . '",
                                                                                "' . $btl['type'] . '",
                                                                                "' . $btl['invis'] . '",
                                                                                "' . $btl['noinc'] . '",
                                                                                "' . $btl['travmChance'] . '",
                                                                                "' . $btl['typeBattle'] . '",
                                                                                "' . $btl['addExp'] . '",
                                                                                "' . $btl['money'] . '",
                                                                                "-1")'
                                        );
                                        if ($ins) {
                                            $btl_id = mysql_insert_id();
                                            //обновляем данные о поединке
                                            mysql_query('UPDATE `users` SET `battle`="' . $btl_id . '" WHERE `id` = "' . $uz2['id'] . '" LIMIT 1');
                                            mysql_query('UPDATE `users` SET `battle`="' . $btl_id . '",`ipreg` = "0" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                                            mysql_query('UPDATE `stats` SET `zv` = "0",`team`="1" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                                            mysql_query('UPDATE `stats` SET `zv` = "0",`team`="2" WHERE `id` = "' . $uz2['id'] . '" LIMIT 1');

                                            //Если бой кулачный, то снимаем вещи
                                            if ($btl['type'] == 1) {
                                                mysql_query('UPDATE `items_users` SET `inOdet`="0" WHERE `uid` = "' . self::$bot['id'] . '" AND `inOdet`!=0');
                                                mysql_query('UPDATE `items_users` SET `inOdet`="0" WHERE `uid` = "' . $uz2['id'] . '" AND `inOdet`!=0');
                                            }

                                            mysql_query('UPDATE `zayvki` SET `start` = "' . time() . '",`btl_id` = "' . $btl_id . '" WHERE `id` = "' . $zv['id'] . '" LIMIT 1');

                                            //обновляем заявку, что бой начался
                                            self::$bot['battle'] = $btl_id;

                                            //Отправляем сообщение в чат всем бойцам
                                            $chatDto = new ChatMessage();
                                            $chatDto->setCity($u->info['city']);
                                            $chatDto->setRoom($u->info['room']);
                                            $chatDto->setTo($uz2['login']);
                                            $chatDto->setType(11);
                                            $chatDto->setSound(117);
                                            (new Chat())->sendMsg($chatDto);
                                        }

                                    } elseif ($pr == 0) {

                                        //Отказ
                                        $sa = '';
                                        if (self::$bot['sex'] == 2) {
                                            $sa = 'а';
                                        }
                                        $text = ' [login:' . self::$bot['login'] . '] отказал' . $sa . ' вам в поединке.';
                                        $chatDto = new ChatMessage();
                                        $chatDto->setCity($uz2['city']);
                                        $chatDto->setTo($uz2['login']);
                                        $chatDto->setText($text);
                                        $chatDto->setType(6);
                                        (new Chat())->sendMsg($chatDto);

                                        mysql_query('UPDATE `stats` SET `zv` = "0",`team` = "1" WHERE `id` = "' . $uz2['id'] . '" LIMIT 1');
                                        mysql_query('UPDATE `zayvki` SET `otk` = ( `otk` + 1 ),`bcs` = "' . (time() + rand(30, rand(60, 180))) . '" WHERE `id` = "' . $zv['id'] . '" LIMIT 1');
                                    }

                                } else {

                                    //Заявку никто не принял, возможно стоит отменить заявку вообще!
                                    if (self::$bot['timeMain'] < time() - 30 - rand((7 / $zv['otk']), (3 * 49 / $zv['otk']))) {

                                        mysql_query('UPDATE `stats` SET `zv` = "0" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                                        mysql_query('UPDATE `users` SET `ipreg` = "0",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                                        mysql_query('UPDATE `zayvki` SET `cancel` = "' . time() . '"  WHERE `id` = "' . $zv['id'] . '" LIMIT 1');

                                    }

                                }

                            }

                        }

                        //Бот уже слишком долго ждет ответа игрока, отказываемся от заявки
                        if (self::$bot['timeMain'] < time() - rand((30 / $zv['otk']), (135 / $zv['otk'])) && $zv['creator'] != self::$bot['id'] && ($zv['razdel'] == 1 || $zv['razdel'] == 2)) {

                            $uz1 = mysql_fetch_array(
                                mysql_query(
                                    'SELECT `u`.`sex`,`u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zv['id'] . '" AND `st`.`team`="1" LIMIT 1'
                                )
                            );
                            if (isset($uz1['id'])) {

                                $sa = '';
                                if (self::$bot['sex'] == 2) {
                                    $sa = 'а';
                                }

                                $text = ' [login:' . self::$bot['login'] . '] отозвал' . $sa . ' свой запрос на бой.';
                                $chatDto = new ChatMessage();
                                $chatDto->setCity($uz1['city']);
                                $chatDto->setTo($uz1['login']);
                                $chatDto->setText($text);
                                $chatDto->setType(6);
                                (new Chat())->sendMsg($chatDto);
                            }

                            mysql_query('UPDATE `zayvki` SET `otk` = ( `otk` + 1 ),`bcs` = "' . (time() + rand(30, rand(60, 180))) . '" WHERE `id` = "' . $zv['id'] . '" LIMIT 1');
                            mysql_query('UPDATE `stats` SET `zv` = "0",`team` = "1" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                            mysql_query('UPDATE `users` SET `ipreg` = "1",`timeMain` = "' . self::rnd() . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                        }

                    }

                } else {
                    self::update('ipreg', 0);
                }

            }

        }
        return true;
    }

    static function team_zv_cf($zv, $tm)
    {
        $r = mysql_fetch_array(mysql_query('SELECT SUM(`btl_cof`) FROM `stats` WHERE `zv` = "' . $zv['id'] . '" AND `team` = "' . $tm . '" LIMIT 1'));
        return $r[0];
    }

    static function new_action()
    {

        $r = rand(1, 7);

        if (self::$bot['level'] < 2) {
            if ($r == 2 || $r == 3 || $r == 6 || $r == 7 || $r == 8) {
                if (rand(0, 1) == 1) {
                    $r = 1; //принимаем физ
                } elseif (rand(0, 1) == 0) {
                    $r = 4; //принимаем турнир
                } else {
                    $r = 5; //подаем физ
                }
            }
        } elseif (self::$bot['level'] == 0) {
            if (rand(0, 1) == 1) {
                $r = 1; //принимаем физ
            } else {
                $r = 5; //подаем физ
            }
        }

        if ($r == 4) {
            $r = 1;
        }

        return $r;

    }


    /*/
    Базовые функции обучения бота
    /*/
    //Бот ищет заявку в группы или хаот для своего уровня и подходящую ему
    static function bot_group_haot_zv($id)
    {
        $rz = 5;

        $sp = mysql_query(
            'SELECT * FROM `zayvki` WHERE `razdel` = "' . $rz . '" AND `cancel` = "0" AND `start` = "0" AND `invise` = "0" AND `money3` = 0 AND (
				( `min_lvl_1` <= ' . self::$bot['level'] . ' AND  `max_lvl_1` >= ' . self::$bot['level'] . ' ) OR ( `min_lvl_2` <= ' . self::$bot['level'] . ' AND  `max_lvl_2` >= ' . self::$bot['level'] . ' )
			)'
        );

        $pr = 0;

        while ($pl = mysql_fetch_array($sp)) {

            if ($pr == 0) {

                $go = 1;
                $tm = [0, 0, 0];

                if ($rz == 4) {

                    $tm1c = mysql_fetch_array(mysql_query('SELECT COUNT(*) FROM `stats` WHERE `zv` = "' . $pl['id'] . '" AND `team` = "1" LIMIT 1'));
                    $tm2c = mysql_fetch_array(mysql_query('SELECT COUNT(*) FROM `stats` WHERE `zv` = "' . $pl['id'] . '" AND `team` = "2" LIMIT 1'));

                    if ($tm1c[0] < $pl['tm1max'] && $pl['min_lvl_1'] <= self::$bot['level'] && $pl['max_lvl_1'] >= self::$bot['level']) {
                        $tm[1] = 1;
                    }

                    if ($tm2c[0] < $pl['tm2max'] && $pl['min_lvl_1'] <= self::$bot['level'] && $pl['max_lvl_1'] >= self::$bot['level']) {
                        $tm[2] = 1;
                    }

                    $atm = 1;
                    $tmr = 0;
                    if ($tm[1] == 1 && $tm[2] == 0) {
                        $tmr = 1;
                    } elseif ($tm[1] == 0 && $tm[2] == 1) {
                        $tmr = 2;
                    } else {
                        $tmr = rand(1, 2);
                    }

                    if ($tmr > 0) {
                        if ($tmr == 1) {
                            $atm = 2;
                        }


                        //Логика приема заявки
                        if ((self::team_zv_cf($pl, $atm) > (self::team_zv_cf(
                                        $pl, $tmr
                                    ) + self::$st['reting']) * 1.67 || ($zv['tm2max'] < $zv['tm1max'] / 2) || ($zv['tm1max'] < $zv['tm2max'] / 2)) && rand(0, 100) < 90) {
                            $go = 0;
                        }
                    }

                } elseif ($rz == 5) {


                    if ($pl['min_lvl_1'] == self::$bot['level'] && $pl['max_lvl_1'] == self::$bot['level']) {
                        $tm[1] = 1;
                    }
                    $col_p = mysql_fetch_array(mysql_query('SELECT COUNT(*) FROM `stats` WHERE `zv` = "' . $pl['id'] . '"'));
                    $cols = $col_p[0];
                    if ($cols >= $pl['maxplayers']) {
                        $go = 0;
                    }

                }


                if ($go == 1 && ($tm[1] != 0 || $tm[2] != 0)) {

                    if ($tm[1] == 1 && $tm[2] == 0) {
                        $tm = 1;
                    } elseif ($tm[1] == 0 && $tm[2] == 1) {
                        $tm = 2;
                    } else {
                        $tm = rand(1, 2);
                    }

                    if ($rz == 5) {
                        $tm = 1;
                    }


                    if ($rz == 5) {
                        $tm = rand(1, 2);

                        if ($pl['invise'] == 0) {
                            $nxtID = mysql_fetch_array(mysql_query('SELECT COUNT(*) FROM `stats` WHERE `zv` = "' . $pl['id'] . '"'));
                            $nxtID = $nxtID[0];
                            self::$bot['login2'] = '';
                        } else {
                            self::$bot['login2'] = '';
                        }

                        $blnc = 100 * self::$bot['level'] + self::$st['reting'];

                        $pl['tm' . $tm] += $blnc;

                        mysql_query('UPDATE `zayvki` SET `tm1` = "' . $pl['tm1'] . '", `tm2` = "' . $pl['tm2'] . '" WHERE `id` = "' . $pl['id'] . '" LIMIT 1');

                    }

                    if ($tm > 0 || $rz == 5) {

                        //Принимаем участие в заявке
                        mysql_query('UPDATE `stats` SET `zv` = "' . $pl['id'] . '",`team` = "' . $tm . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                        mysql_query('UPDATE `users` SET `login2` = "' . self::$bot['login2'] . '",`ipreg` = "8" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                        self::$bot['zv'] = $pl['id'];
                        $pr = $pl['id'];

                    }

                } //if

            } // while

        }

    }

    //Добавляем нового бота
    static function createNewBot($login, $sex)
    {
        if ($sex != 1) {
            $sex = 0;
        } else {
            $se = 1;
        }

        $r = ['name' => '_', 'chatColor' => 'Black'];

        $ins = mysql_query(
            "INSERT INTO `users` (`fnq`,`host_reg`,`room`,`login`,`pass`,`ipreg`,`ip`,`city`,`cityreg`,`name`,`sex`,`chatColor`,`timereg`) VALUES (
						'0',
						'real_bot_user',
						'0',
						'" . mysql_real_escape_string($login) . "',
						'" . md5('regnxt#$%^а0.' . time()) . "',
						'127.0.0.1',
						'127.0.0.1',
						'capitalcity',
						'capitalcity',
						'" . $r['name'] . "',
						'" . mysql_real_escape_string($sex) . "',
						'" . $r['chatColor'] . "',
						'" . time() . "')"
        );
        if ($ins) {
            $uid = mysql_insert_id();
            mysql_query("INSERT INTO `online` (`uid`,`timeStart`) VALUES ('" . $uid . "','" . time() . "')");
            mysql_query("INSERT INTO `stats` (`id`,`stats`) VALUES ('" . $uid . "','s1=3|s2=3|s3=3|s4=3|rinv=40|m9=5|m6=10')");
            mysql_query("UPDATE `users` SET `online`='" . time() . "' WHERE `uid` = '" . $uid . "' LIMIT 1");
        }

    }

    //Бот находится в онлайне
    static function _online(): void
    {
        if (self::$bot['online'] >= time() - 60) {
            return;
        }
        //уровень/апп
        if (self::$bot['battle'] == 0 && self::$bot['zv'] == 0) {
            self::levelUp();
        }
        self::update('online', time());
    }

    //Бот меняет локацию
    static function _loc_A($a, $b)
    {
        return $b;
    }

    static function _loc_zv()
    {

        if (rand(0, 100) < 5) {
            $r = 1;
        } else {
            $r = rand(1, 4);
        }

        //будуар
        if ($r == 4 && self::$bot['sex'] != 1) {
            $r = rand(1, 3);
        }

        if (self::$bot['city'] == 'capitalcity') {
            if ($r == 4) {
                //будуар
                $r = 7;
            } elseif ($r == 3) {
                //ЗВ 3
                $r = 5;
            } elseif ($r == 2) {
                //ЗВ 2
                $r = 2;
            } else {
                //ЗВ 1
                $r = 4;
            }

            if (self::$bot['level'] == 0) {
                //Новички
                $r = 0;
            }

        }

        return $r;
    }

    static function _loc($id)
    {

        if ($id == self::$bot['room']) {
            //ничего, уже пришли
            self::update('a1', 0);

        } else {

            //Прокладываем маршрут из текущей комнаты
            $rid_next = self::_loc_A(self::$bot['room'], $id);
            if ($rid_next > 0) {
                //Идем туда
                //$rid_next = 377;
                mysql_query('UPDATE `users` SET `room` = "' . $rid_next . '" WHERE `id` = "' . self::$bot['id'] . '" LIMIT 1');
                return true;
            } else {
                //Невозможно дойти туда
                return false;
            }

        }

    }

    /** Бот получил уровень, либо ап
     * @return void
     */
    private static function levelUp(): void
    {
        $lvl = Db::getRow('select exp, upLevel from levels where upLevel = ?', [self::$bot['upLevel'] + 1]);
        if (isset($lvl['upLevel'])) {
            if (
                self::$bot['level'] <= 5 &&
                self::$bot['exp'] >= 12499 &&
                Db::getValue('select count(id) from items_users where item_id = 1204 and uid = ?', [self::$bot['id']]) === 0
            ) {
                ItemsModel::addItem(1204, self::$bot['id']);
                self::$bot['exp'] = 12500;
            }
            if ($lvl['exp'] <= self::$bot['exp']) {
                file_get_contents(
                    '/main_bot.php?uid=' . self::$bot['id'] . '&cron_core=' . md5(self::$bot['id'] . '_brfCOreW@!_' . self::$bot['pass']) . '&pass=' . self::$bot['pass'] . '&',
                    false,
                    stream_context_create(['https' => ['timeout' => 1]])
                );
                Db::sql('update users set clss = 0 where id = ?', [self::$bot['id']]);
            }
        } else {
            self::e(self::$bot['login']);
        }
    }

    //Вспомогательные функции
    static function e($t): void
    {
        (new Chat())->debug($t, true);
    }

    static function rnd()
    {
        return time() + rand(3, 14) + rand(0, 14) + rand(7, 21);
    }

    private static function update($n, $v, $t = 'users'): void
    {
        Db::sql("update users set $n = ? where id = ?", [$v, self::$bot['id']]);
        self::$bot[$n] = $v;
    }

}