<?php

/*
 * UDWBase: WOWDB Web Interface
 *
 * © UDW 2009-2011
 *
 * Released under the terms and conditions of the
 * GNU General Public License (http://gnu.org).
 *
 */

// Необходима функция questinfo
require_once('includes/allquests.php');
require_once('includes/allobjects.php');
require_once('includes/allnpcs.php');
require_once('includes/allcomments.php');

$smarty->config_load($conf_file, 'quest');

// Номер квеста
$id = $podrazdel;

if (!$quest = load_cache(10, intval($id))) {
    unset($quest);

    // Подключаемся к ДБ:
    global $DB;

    // Основная инфа
    $quest = GetDBQuestInfo($id, 0xFFFFFF);


    /*              ЦЕПОЧКА КВЕСТОВ              */
    // Добавляем сам квест в цепочку
    $quest['series'] = array(
        array(
            'entry' => $quest['entry'],
            'Title' => $quest['Title'],
            'NextQuestInChain' => $quest['NextQuestInChain']
        )
    );
    // Квесты в цепочке до этого квеста
    $tmp = $quest['series'][0];
    while ($tmp) {
        $tmp = $DB->selectRow('
			SELECT q.entry, q.Title
				{, l.Title_loc?d AS `Title_loc`}
			FROM ?_quest_template q
				{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?d}
			WHERE q.NextQuestInChain=?d
			LIMIT 1
			', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['series'][0]['entry']
        );
        if ($tmp) {
            if (!empty($tmp['Title_loc']))
                $tmp['Title'] = $tmp['Title_loc'];
            array_unshift($quest['series'], $tmp);
        }
    }
    // Квесты в цепочке после этого квеста
    $tmp = end($quest['series']);
    while ($tmp) {
        $tmp = $DB->selectRow('
			SELECT q.entry, q.Title, q.NextQuestInChain
				{, l.Title_loc?d AS `Title_loc`}
			FROM ?_quest_template q
				{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
			WHERE q.entry=?d
			LIMIT 1
			', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['series'][count($quest['series']) - 1]['NextQuestInChain']
        );
        if ($tmp) {
            if (!empty($tmp['Title_loc']))
                $tmp['Title'] = $tmp['Title_loc'];
            array_push($quest['series'], $tmp);
        }
    }
    unset($tmp);
    if (count($quest['series']) <= 1)
        unset($quest['series']);


    /*              ДРУГИЕ КВЕСТЫ              */
    // (после их нахождения проверяем их тайтлы на наличие локализации)
    // Квесты, которые необходимо выполнить, что бы получить этот квест
    if (!$quest['req'] = $DB->select('
				SELECT q.entry, q.Title, q.NextQuestInChain
					{, l.Title_loc?d AS `Title_loc`}
				FROM ?_quest_template q
					{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
				WHERE
					(q.NextQuestID=?d AND q.ExclusiveGroup<0)
					OR (q.entry=?d AND q.NextQuestInChain<>?d)
				LIMIT 20', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry'], $quest['PrevQuestID'], $quest['entry']
            )
    )
        unset($quest['req']);
    else
        $questItems[] = 'req';

    // Квесты, которые становятся доступными, только после того как выполнен этот квест (необязательно только он)
    if (!$quest['open'] = $DB->select('
				SELECT q.entry, q.Title
					{, l.Title_loc?d AS `Title_loc`}
				FROM ?_quest_template q
					{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
				WHERE
					(q.PrevQuestID=?d AND q.entry<>?d)
					OR q.entry=?d
				LIMIT 20', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry'], $quest['NextQuestInChain'], $quest['NextQuestID']
            )
    )
        unset($quest['open']);
    else
        $questItems[] = 'open';

    // Квесты, которые становятся недоступными после выполнения этого квеста
    if ($quest['ExclusiveGroup'] > 0)
        if (!$quest['closes'] = $DB->select('
				SELECT q.entry, q.Title
					{, l.Title_loc?d AS `Title_loc`}
				FROM ?_quest_template q
					{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
				WHERE
					q.ExclusiveGroup=?d AND q.entry<>?d
				LIMIT 20
				', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['ExclusiveGroup'], $quest['entry']
                )
        )
            unset($quest['closes']);
        else
            $questItems[] = 'closes';

    // Требует выполнения одного из квестов, на выбор:
    if (!$quest['reqone'] = $DB->select('
				SELECT q.entry, q.Title
					{, l.Title_loc?d AS `Title_loc`}
				FROM ?_quest_template q
					{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
				WHERE
					q.ExclusiveGroup>0 AND q.NextQuestId=?d
				LIMIT 20
				', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry']
            )
    )
        unset($quest['reqone']);
    else
        $questItems[] = 'reqone';

    // Квесты, которые доступны, только во время выполнения этого квеста
    if (!$quest['enables'] = $DB->select('
				SELECT q.entry, q.Title
					{, l.Title_loc?d AS `Title_loc`}
				FROM ?_quest_template q
					{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
				WHERE q.PrevQuestID=?d
				LIMIT 20
				', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, -$quest['entry']
            )
    )
        unset($quest['enables']);
    else
        $questItems[] = 'enables';

    // Квесты, во время выполнения которых доступен этот квест
    if ($quest['PrevQuestID'] < 0)
        if (!$quest['enabledby'] = $DB->select('
				SELECT q.entry, q.Title
					{, l.Title_loc?d AS `Title_loc`}
				FROM ?_quest_template q
					{LEFT JOIN (?_locales_quest l) ON l.entry=q.entry AND ?}
				WHERE q.entry=?d
				LIMIT 20
				', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, -$quest['PrevQuestID']
                )
        )
            unset($quest['enabledby']);
        else
            $questItems[] = 'enabledby';

    // Теперь локализуем все тайтлы квестов
    if ($questItems)
        foreach ($questItems as $item)
            foreach ($quest[$item] as $i => $x)
                if (!empty($quest[$item][$i]['Title_loc']))
                    $quest[$item][$i]['Title'] = $quest[$item][$i]['Title_loc'];



    /*             НАГРАДЫ И ТРЕБОВАНИЯ             */

    if ($quest['RequiredSkillValue'] > 0 && $quest['SkillOrClass'] > 0) {
        // Требуемый уровень скилла, что бы получить квест
        /*
          $skills = array(
          -264 => 197,	// Tailoring
          -182 => 165,	// Leatherworking
          -24 => 182,		// Herbalism
          -101 => 356,	// Fishing
          -324 =>	129,	// First Aid
          -201 => 202,	// Engineering
          -304 => 185,	// Cooking
          -121 => 164,	// Blacksmithing
          -181 => 171		// Alchemy
          );
         */

        // TODO: skill localization
        $quest['reqskill'] = array(
            'name' => $DB->selectCell('SELECT name_loc' . $_SESSION['locale'] . ' FROM ?_aowow_skill WHERE skillID=?d LIMIT 1', $quest['SkillOrClass']),
            'value' => $quest['RequiredSkillValue']
        );
    } elseif ($quest['SkillOrClass'] < 0)
    // Требуемый класс, что бы получить квест
        $quest['reqclass'] = $classes[abs($quest['SkillOrClass'])];

    // Требуемые отношения с фракциями, что бы начать квест
    if ($quest['RequiredMinRepFaction'] && $quest['RequiredMinRepValue'])
        $quest['RequiredMinRep'] = array(
            'name' => $DB->selectCell('SELECT name_loc' . $_SESSION['locale'] . ' FROM ?_aowow_factions WHERE factionID=?d LIMIT 1', $quest['RequiredMinRepFaction']),
            'entry' => $quest['RequiredMinRepFaction'],
            'value' => $reputations[$quest['RequiredMinRepValue']]
        );
    if ($quest['RequiredMaxRepFaction'] && $quest['RequiredMaxRepValue'])
        $quest['RequiredMaxRep'] = array(
            'name' => $DB->selectCell('SELECT name_loc' . $_SESSION['locale'] . ' FROM ?_aowow_factions WHERE factionID=?d LIMIT 1', $quest['RequiredMaxRepFaction']),
            'entry' => $quest['RequiredMaxRepFaction'],
            'value' => $reputations[$quest['RequiredMaxRepValue']]
        );

    // Спеллы не требуют локализации, их инфа берется из базы
    // Хранить в базе все локализации - задачка на будующее
    // Спелл, кастуемый на игрока в начале квеста
    if ($quest['SrcSpell']) {
        $tmp = $DB->selectRow('
			SELECT ?#, s.spellname_loc' . $_SESSION['locale'] . '
			FROM ?_aowow_spell s, ?_aowow_spellicons si
			WHERE
				s.spellID=?d
				AND si.id=s.spellicon
			LIMIT 1', $spell_cols[0], $quest['SrcSpell']
        );
        if ($tmp) {
            $quest['SrcSpell'] = array(
                'name' => $tmp['spellname_loc' . $_SESSION['locale']],
                'entry' => $tmp['spellID']);
            allspellsinfo2($tmp);
        }
        unset($tmp);
    }

    // Спелл, кастуемый на игрока в награду за выполнение
    if ($quest['RewSpellCast'] > 0 || $quest['RewSpell'] > 0) {
        $tmp = $DB->SelectRow('
			SELECT ?#, s.spellname_loc' . $_SESSION['locale'] . '
			FROM ?_aowow_spell s, ?_aowow_spellicons si
			WHERE
				s.spellID=?d
				AND si.id=s.spellicon
			LIMIT 1', $spell_cols[0], $quest['RewSpell'] > 0 ? $quest['RewSpell'] : $quest['RewSpellCast']
        );
        if ($tmp) {
            $quest['spellreward'] = array(
                'name' => $tmp['spellname_loc' . $_SESSION['locale']],
                'entry' => $tmp['spellID']);
            allspellsinfo2($tmp);
        }
        unset($tmp);
    }

    // Создания, необходимые для квеста
    //$quest['creaturereqs'] = array();
    //$quest['objectreqs'] = array();
    $quest['coreqs'] = array();
    for ($i = 0; $i <= 4; ++$i) {
        //echo $quest['ReqCreatureOrGOCount'.$i].'<br />';
        if ($quest['ReqCreatureOrGOId' . $i] != 0 && $quest['ReqCreatureOrGOCount' . $i] != 0) {
            if ($quest['ReqCreatureOrGOId' . $i] > 0) {
                // Необходимо какое-либо взамодействие с созданием
                $quest['coreqs'][$i] = array_merge(
                        creatureinfo($quest['ReqCreatureOrGOId' . $i]), array('req_type' => 'npc')
                );
            } else {
                // необходимо какое-то взаимодействие с объектом
                $quest['coreqs'][$i] = array_merge(
                        objectinfo(-$quest['ReqCreatureOrGOId' . $i]), array('req_type' => 'object')
                );
            }
            // Количество
            $quest['coreqs'][$i]['count'] = $quest['ReqCreatureOrGOCount' . $i];
            // Спелл
            if ($quest['ReqSpellCast' . $i])
                $quest['coreqs'][$i]['spell'] = array(
                    'name' => $DB->selectCell('SELECT spellname_loc' . $_SESSION['locale'] . ' FROM ?_aowow_spell WHERE spellid=?d LIMIT 1', $quest['ReqSpellCast' . $i]),
                    'entry' => $quest['ReqSpellCast' . $i]
                );
        }
    }
    if (!$quest['coreqs'])
        unset($quest['coreqs']);

    // Вещи, необходимые для квеста
    $quest['itemreqs'] = array();
    for ($i = 0; $i <= 4; ++$i) {
        if ($quest['ReqItemId' . $i] != 0 && $quest['ReqItemCount' . $i] != 0)
            $quest['itemreqs'][] = array_merge(iteminfo($quest['ReqItemId' . $i]), array('count' => $quest['ReqItemCount' . $i]));
    }
    if (!$quest['itemreqs'])
        unset($quest['itemreqs']);

    // Фракции необходимые для квеста
    if ($quest['RepObjectiveFaction'] > 0 && $quest['RepObjectiveValue'] > 0) {
        $quest['factionreq'] = array(
            'name' => $DB->selectCell('SELECT name_loc' . $_SESSION['locale'] . ' FROM ?_aowow_factions WHERE factionID=?d LIMIT 1', $quest['RepObjectiveFaction']),
            'entry' => $quest['RepObjectiveFaction'],
            'value' => $reputations[$quest['RepObjectiveValue']]
        );
    }

    /* КВЕСТГИВЕРЫ И КВЕСТТЕЙКЕРЫ */

    // КВЕСТГИВЕРЫ
    // НПС
    $rows = $DB->select('
		SELECT c.entry, c.name, A, H
			{, l.name_loc?d as `name_loc`}
		FROM ?_creature_questrelation q, ?_aowow_factiontemplate, ?_creature_template c
			{LEFT JOIN (?_locales_creature l) ON l.entry=c.entry AND ?}
		WHERE
			q.quest=?d
			AND c.entry=q.id
			AND factiontemplateID=c.faction_A
		', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry']
    );
    if ($rows) {
        foreach ($rows as $tmp) {
            if (!empty($tmp['name_loc']))
                $tmp['name'] = $tmp['name_loc'];
            if ($tmp['A'] == -1 && $tmp['H'] == 1)
                $tmp['side'] = 'horde';
            elseif ($tmp['A'] == 1 && $tmp['H'] == -1)
                $tmp['side'] = 'alliance';
            $quest['start'][] = array_merge($tmp, array('type' => 'npc'));
        }
    }
    unset($rows);

    // ГО
    $rows = $DB->select('
		SELECT g.entry, g.name
			{, l.name_loc?d as `name_loc`}
		FROM ?_gameobject_questrelation q, ?_gameobject_template g
			{LEFT JOIN (?_locales_gameobject l) ON l.entry = g.entry AND ?}
		WHERE
			q.quest=?d
			AND g.entry=q.id
		', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry']
    );
    if ($rows) {
        foreach ($rows as $tmp) {
            if (!empty($tmp['name_loc']))
                $tmp['name'] = $tmp['name_loc'];
            $quest['start'][] = array_merge($tmp, array('type' => 'object'));
        }
    }
    unset($rows);

    // итем
    $rows = $DB->select('
		SELECT i.name, i.entry, i.quality, LOWER(a.iconname) AS iconname
			{, l.name_loc?d as `name_loc`}
		FROM ?_aowow_icons a, ?_item_template i
			{LEFT JOIN (?_locales_item l) ON l.entry=i.entry AND ?}
		WHERE
			startquest = ?d
			AND id = displayid
		', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry']
    );
    if ($rows) {
        foreach ($rows as $tmp) {
            if (!empty($tmp['name_loc']))
                $tmp['name'] = $tmp['name_loc'];
            $quest['start'][] = array_merge($tmp, array('type' => 'item'));
        }
    }
    unset($rows);

    // КВЕСТТЕЙКЕРЫ
    // НПС
    $rows = $DB->select('
		SELECT c.entry, c.name, A, H
			{, l.name_loc?d as `name_loc`}
		FROM ?_creature_involvedrelation q, ?_aowow_factiontemplate, ?_creature_template c
			{LEFT JOIN (?_locales_creature l) ON l.entry=c.entry AND ?}
		WHERE
			q.quest=?d
			AND c.entry=q.id
			AND factiontemplateID=c.faction_A
		', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry']
    );
    if ($rows) {
        foreach ($rows as $tmp) {
            if (!empty($tmp['name_loc']))
                $tmp['name'] = $tmp['name_loc'];
            if ($tmp['A'] == -1 && $tmp['H'] == 1)
                $tmp['side'] = 'horde';
            elseif ($tmp['A'] == 1 && $tmp['H'] == -1)
                $tmp['side'] = 'alliance';
            $quest['end'][] = array_merge($tmp, array('type' => 'npc'));
        }
    }
    unset($rows);

    // ГО
    $rows = $DB->select('
		SELECT g.entry, g.name
			{, l.name_loc?d as `name_loc`}
		FROM ?_gameobject_involvedrelation q, ?_gameobject_template g
			{LEFT JOIN (?_locales_gameobject l) ON l.entry = g.entry AND ?}
		WHERE
			q.quest=?d
			AND g.entry=q.id
		', ($_SESSION['locale'] > 0) ? $_SESSION['locale'] : DBSIMPLE_SKIP, ($_SESSION['locale'] > 0) ? 1 : DBSIMPLE_SKIP, $quest['entry']
    );
    if ($rows) {
        foreach ($rows as $tmp) {
            if (!empty($tmp['name_loc']))
                $tmp['name'] = $tmp['name_loc'];
            $quest['end'][] = array_merge($tmp, array('type' => 'object'));
        }
    }
    unset($rows);

    save_cache(10, $quest['entry'], $quest);
}

global $page;
$page = array(
    'Mapper' => false,
    'Book' => false,
    'Title' => $quest['Title'] . ' - ' . $smarty->get_config_vars('Quests'),
    'tab' => 0,
    'type' => 5,
    'typeid' => $quest['entry'],
    'path' => '[]'
);
$smarty->assign('page', $page);

// Комментарии
$smarty->assign('comments', getcomments($page['type'], $page['typeid']));

// Данные о квесте
$smarty->assign('quest', $quest);
// Если хоть одна информация о вещи найдена - передаём массив с информацией о вещях шаблонизатору
if (isset($allitems))
    $smarty->assign('allitems', $allitems);
if (isset($allspells))
    $smarty->assign('allspells', $allspells);
// Количество MySQL запросов
$smarty->assign('mysql', $DB->getStatistics());
// Загружаем страницу
$smarty->display('quest.tpl');