<?php
# Date: 26.10.2020 (16:08)

class Travel
{
    /**
     * Соответствие ID комнаты игровому файлу.
     * @var string[]
     */
    private static $roomFileName = [
        20 => 'city.php',
        21 => 'city.php',
        22 => 'shop.php',
        23 => 'repair.php',
        25 => 'comission.php',
        26 => 'city.php',
        27 => 'post.php',
        29 => 'bank.php',
        30 => 'clan_create.php',
        31 => 'tower.php',
        34 => 'fshop.php',
        37 => 'gotzamok.php',
        50 => 'ashop.php',
        51 => 'city.php',
        61 => 'akadem.php',
        401 => 'hell.php',
        402 => 'lab_chaos_enter.php',
        404 => 'vxod.php',
        603 => 'aren_of_angels.php',
        620 => 'enter_cave.php',
        650 => 'ul_clans.php',
        660 => 'hostel.php',
        666 => 'jail.php',
        777 => 'obshaga.php',
        1051 => 'lab_enter.php',
        1055 => 'group_arena.php',
        2111 => 'city.php',
        2601 => 'city.php',
        2655 => 'city.php',
        2702 => 'city.php'
    ];

    /**
     * Перемещение по комнатам.
     * @param int $roomId        ID куда идём.
     * @param int $roomIdCurrent ID откуда идём.
     * @throws \Krugozor\Database\Mysql\Exception
     */
    public static function toRoom(int $roomId, int $roomIdCurrent): void
    {
        $itemsWeight = db::c()->query('SELECT SUM(weight) AS all_weight FROM `inventory` WHERE owner_id = ?i AND on_sale = 0', $_SESSION['uid'])->fetch_assoc();
        $eff = db::c()->query('SELECT type FROM users_effects WHERE owner_id = ?i AND (`type` = 10 OR `type` = 13 OR `type` = 14)', $_SESSION['uid'])->fetch_assoc();
        $errors = [];
        if ($itemsWeight['all_weight'] > get_meshok()) {
            $errors[0] = 'У вас переполнен рюкзак, вы не можете передвигаться...';
        }
        if ($eff['type'] == 10) {
            $errors[1] = 'Вы парализованы и не можете передвигаться...';
        }
        if ($eff['type'] == 13 || $eff['type'] == 14) {
            $errors[2] = 'У вас тяжелая травма, вы не можете передвигаться...';
        }
        if ($errors) {
            foreach ($errors as $error) {
                echo sprintf('<span class="error">%s</span>', $error);
            }
        } elseif (in_array($roomId, self::allowedRoomMoves($roomIdCurrent))) {
            db::c()->query('UPDATE users, online SET users.room = ?i, online.room = ?i WHERE `online`.`user_id` = `users`.`id` AND `online`.`user_id` = ?i', $roomId, $roomId, $_SESSION['uid']);
            header('location: ' . self::$roomFileName[$roomId]);
            exit;
        }
    }

    /**
     * Проверка можно ли перейти из комнаты в комнату.
     * @param int $roomId ID комнаты
     * @return array|int[]
     */
    private static function allowedRoomMoves(int $roomId): array
    {
        /*
         * 1 location: main.php?goto=arena
         * 2 Room 22 shop.php
         * 3 Room 25 comission.php
         * 4 Room 23 repair.php
         * 6 Room 27 posr.php
         * 7 Room 21 [STREET]
         * 8 Room 26 [STREET]
         * 13 location: quest_room.php
         * 17 Room 50 ashop.php
         * 222 Room 2702 [STREET]
         */
        $room[20] = [21, 22, 23, 25, 26, 27, 50, 2702];
        $room[22] = $room[23] = $room[25] = $room[27] = $room[50] = [20];
        /*
         * 3 Room 2111 [STREET]
         * 4 Room 20 [STREET]
         * 5 Room 29 Bank.php
         * 13 Room 34 fshop.php
         * 14 Room 30 clan_create.php
         * 16 Room 31 tower.php
         * 650 Room 650 ul_clans.php
         */
        $room[21] = [20, 29, 30, 31, 34, 650, 2111];
        $room[29] = $room[30] = $room[31] = $room[34] = [21];

        $room[26] = [20, 401, 660, 777, 2601];
        $room[401] = $room[660] = $room[777] = [26];

        $room[2601] = [26, 37, 404, 1051, 2655];

        $room[2655] = [603, 2601];

        /*
         * 1 Room 21 [STREET]
         * 2 location: city.php?haos - где эта херня вообще?
         * 14 NULL
         * 21 NULL
         * 203 Room 1055 group_arena.php
         * [!not on map]666 Room 666 jail.php
         * 1000
         */
        $room[2111] = [21, 620, 666, 1055];
        $room[2701] = [402, 2111];
        $room[2702] = [20, 61];
        if ($room[$roomId] === null) {
            return [];
        }
        return $room[$roomId];
    }
}