<?php require_once 'engine/init.php'; include 'layout/overall/header.php';

// Loading spell list
$spellsCache = new Cache('engine/cache/spells');
if (user_logged_in() && is_admin($user_data)) {
	if (isset($_GET['update'])) {
		echo "<p><strong>Logged in as admin, loading engine/XML/spells.xml file and updating cache.</strong></p>";
		// SPELLS XML TO PHP ARRAY
		$spellsXML = simplexml_load_file("engine/XML/spells.xml");
		if ($spellsXML !== false) {
			$types = array();
			$type_attr = array();
			$groups = array();

			// This empty array will eventually contain all spells grouped by type and indexed by spell name
			$spells = array();

			// Loop through each XML spell object
			foreach ($spellsXML as $type => $spell) {
				// Get spell types
				if (!in_array($type, $types)) {
					$types[] = $type;
					$type_attr[$type] = array();
				}
				// Get spell attributes
				$attributes = array();
				// Extract attribute values from the XML object and store it in a more manage friendly way $attributes
				foreach ($spell->attributes() as $aName => $aValue)
					$attributes["$aName"] = "$aValue";
				// Remove unececsary attributes
				if (isset($attributes['script'])) unset($attributes['script']);
				if (isset($attributes['spellid'])) unset($attributes['spellid']);
				//if (isset($attributes['id'])) unset($attributes['id']);
				//if (isset($attributes['conjureId'])) unset($attributes['conjureId']);
				if (isset($attributes['function'])) unset($attributes['function']);
				// Populate type attributes
				foreach (array_keys($attributes) as $attr) {
					if (!in_array($attr, $type_attr[$type]))
						$type_attr[$type][] = $attr;
				}
				// Get spell groups
				if (isset($attributes['group'])) {
					if (!in_array($attributes['group'], $groups))
						$groups[] = $attributes['group'];
				}
				// Get spell vocations
				$vocations = array();
				foreach ($spell->vocation as $vocation) {
					foreach ($vocation->attributes() as $attributeName => $attributeValue) {
						if ("$attributeName" == "name") {
							$vocId = vocation_name_to_id("$attributeValue");
							$vocations[] = ($vocId !== false) ? $vocId : "$attributeValue";
						} elseif ("$attributeName" == "id") {
							$vocations[] = (int)"$attributeValue";
						}
					}
				}
				// Exclude monster spells (Monster spells looks like this on the ORTS data pack)
				$words = (isset($attributes['words'])) ? $attributes['words'] : false;
				// Also exclude "house spells" such as aleta sio.
				$name = (isset($attributes['name'])) ? $attributes['name'] : false;
				if (substr($words, 0, 3) !== '###' && substr($name, 0, 5) !== 'House') {
					// Build full spell list where the spell name is the key to the spell array.
					$spells[$type][$name] = array('vocations' => $vocations);
					// Populate spell array with potential relevant attributes for the spell type
					foreach ($type_attr[$type] as $att)
						$spells[$type][$name][$att] = (isset($attributes[$att])) ? $attributes[$att] : false;
				}
			}
			// Sort the spell list properly
			foreach (array_keys($spells) as $type) {
				usort($spells[$type], function ($a, $b) {
					if (isset($a['lvl']))
						return $a['lvl'] - $b['lvl'];
					if (isset($a['maglv']))
						return $a['maglv'] - $b['maglv'];
					return -1;
				});
			}
			$spellsCache->setContent($spells);
			$spellsCache->save();
		} else {
			echo "<p><strong>Failed to load engine/XML/spells.xml file.</strong></p>";
		}
	} else {
		$spells = $spellsCache->load();
		?>
		<form action="">
			<input type="submit" name="update" value="Generate new cache">
		</form>
		<?php
	}
	// END SPELLS XML TO PHP ARRAY
} else {
	$spells = $spellsCache->load();
}
// End loading spell list

if ($spells) {
	// Preparing data
	$configVoc = $config['vocations'];
	$types = array_keys($spells);
	$itemServer = 'http://'.$config['shop']['imageServer'].'/';

	// Filter spells by vocation
	$getVoc = (isset($_GET['vocation'])) ? getValue($_GET['vocation']) : 'all';
	if ($getVoc !== 'all') {
		$getVoc = (int)$getVoc;
		foreach ($types as $type)
			foreach ($spells[$type] as $name => $spell)
				if (!empty($spell['vocations']))
					if (!in_array($getVoc, $spell['vocations']))
						unset($spells[$type][$name]);
	}

	// Render HTML
	?>

	<h1 id="spells">Spells<?php if ($getVoc !== 'all') echo ' ('.$configVoc[$getVoc]['name'].')';?></h1>

	<form action="#spells" class="filter_spells">
		<label for="vocation">Filter vocation:</label>
		<select id="vocation" name="vocation">
			<option value="all">All</option>
			<?php foreach ($config['vocations'] as $id => $vocation): ?>
				<option value="<?php echo $id; ?>" <?php if ($getVoc === $id) echo "selected"; ?>><?php echo $vocation['name']; ?></option>
			<?php endforeach; ?>
		</select>
		<input type="submit" value="Search">
	</form>

	<h2>Spell types:</h2>
	<ul>
		<?php foreach ($types as $type): ?>
		<li><a href="#spell_<?php echo $type; ?>"><?php echo ucfirst($type); ?></a></li>
		<?php endforeach; ?>
	</ul>

	<h2 id="spell_instant">Instant Spells</h2>
	<a href="#spells">Jump to top</a>
	<table class="table tbl-hover">
		<tbody>
			<tr class="yellow">
				<td>Name</td>
				<td>Words</td>
				<td>Level</td>
				<td>Mana</td>
				<td>Vocations</td>
			</tr>
			<?php foreach ($spells['instant'] as $spell): ?>
			<tr>
				<td><?php echo $spell['name']; ?></td>
				<td><?php echo $spell['words']; ?></td>
				<td><?php echo $spell['lvl']; ?></td>
				<td><?php echo $spell['mana']; ?></td>
				<td><?php
				if (!empty($spell['vocations'])) {
					$names = array();
					foreach ($spell['vocations'] as $id) {
						if (isset($configVoc[$id]))
							$names[] = $configVoc[$id]['name'];
					}
					echo implode(',<br>', $names);
				}
				?></td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<h2 id="spell_rune">Magical Runes</h2>
	<a href="#spells">Jump to top</a>
	<table class="table tbl-hover">
		<tbody>
			<tr class="yellow">
				<td>Name</td>
				<td>Level</td>
				<td>Magic Level</td>
				<td>Image</td>
				<td>Vocations</td>
			</tr>
			<?php foreach ($spells['rune'] as $spell): ?>
			<tr>
				<td><?php echo $spell['name']; ?></td>
				<td><?php echo $spell['lvl']; ?></td>
				<td><?php echo $spell['maglv']; ?></td>
				<td><img src="<?php echo $itemServer.$spell['id'].'.gif'; ?>" alt="Rune image"></td>
				<td><?php
				if (!empty($spell['vocations'])) {
					$names = array();
					foreach ($spell['vocations'] as $id) {
						if (isset($configVoc[$id]))
							$names[] = $configVoc[$id]['name'];
					}
					echo implode(',<br>', $names);
				}
				?></td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<h2 id="spell_conjure">Conjure Spells</h2>
	<a href="#spells">Jump to top</a>
	<table class="table tbl-hover">
		<tbody>
			<tr class="yellow">
				<td>Name</td>
				<td>Words</td>
				<td>Level</td>
				<td>Mana</td>
				<td>Soul</td>
				<td>Charges</td>
				<td>Image</td>
				<td>Vocations</td>
			</tr>
			<?php foreach ($spells['conjure'] as $spell): ?>
			<tr>
				<td><?php echo $spell['name']; ?></td>
				<td><?php echo $spell['words']; ?></td>
				<td><?php echo $spell['lvl']; ?></td>
				<td><?php echo $spell['mana']; ?></td>
				<td><?php echo $spell['soul']; ?></td>
				<td><?php echo $spell['conjureCount']; ?></td>
				<td><img src="<?php echo $itemServer.$spell['conjureId'].'.gif'; ?>" alt="Rune image"></td>
				<td><?php
				if (!empty($spell['vocations'])) {
					$names = array();
					foreach ($spell['vocations'] as $id) {
						if (isset($configVoc[$id]))
							$names[] = $configVoc[$id]['name'];
					}
					echo implode(',<br>', $names);
				}
				?></td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
	<a href="#spells">Jump to top</a>
	<?php
} else {
	?>
	<h1>Spells</h1>
	<p>Spells have currently not been loaded into the website by the server admin.</p>
	<?php
}

/* Debug tests
foreach ($spells as $type => $spells) {
	data_dump($spells, false, "Type: $type");
}

// All spell attributes?
'group', 'words', 'lvl', 'maglv', 'charges', 'allowfaruse', 'blocktype', 'mana', 'soul', 'prem', 'aggressive', 'range', 'selftarget', 'needtarget', 'blockwalls', 'needweapon', 'exhaustion', 'groupcooldown', 'needlearn', 'casterTargetOrDirection', 'direction', 'params', 'playernameparam', 'conjureId', 'reagentId', 'conjureCount', 'vocations'
*/
include 'layout/overall/footer.php'; ?>