<?php
class Output {
	private $db;
	private $mapper;
	private $vehicleTypes;
	
	function __construct(Database $db, Mapper $mapper, VehicleTypes $vehicleTypes) {
		$this->db = $db;
		$this->mapper = $mapper;
		$this->vehicleTypes = $vehicleTypes;
	}
	
	function createMapping($saveConfig = FALSE) {
		$mapping = [];
		foreach($this->db->getAllById() as $vehicle) {
			$mapping[$vehicle['id']] = $this->vehicleTypes->getByNumber($vehicle['num']);
		}
		
		if($saveConfig) {
			$json = json_encode($mapping);
			if(!file_put_contents($saveConfig['result_temp'], $json)) {
				throw new Exception('Result save failed');
			}
			rename($saveConfig['result_temp'], $saveConfig['result']);
		}
		
		return $mapping;
	}
	
	function createVehiclesList($fullMapping, $saveConfig = FALSE) {
		$trips = $this->mapper->getTTSSTrips();
		
		$lines = [];
		$vehicles = [];
		foreach($trips as $trip) {
			$vehicle = $fullMapping[$trip['id']] ?? [];
			$vehicle += ['trip' => $trip['id']];
			$lines[$trip['line']][] = [
				'trip' => $trip,
				'vehicle' => $vehicle,
			];
			$vehicles[$vehicle['type'] ?? '?'][] = $vehicle;
		}
		
		foreach($lines as &$line) {
			usort($line, function($a, $b) {
				return (substr($a['vehicle']['num'] ?? '', 2) <=> substr($b['vehicle']['num'] ?? '', 2)); 
			});
		}
		unset($line);
		ksort($lines);
		
		foreach($vehicles as &$vehicle) {
			usort($vehicle, function($a, $b) {
				return (substr($a['num'] ?? '', 2) <=> substr($b['num'] ?? '', 2));
			});
		}
		unset($vehicle);
		ksort($vehicles);
		
		$dbMapping = $this->db->getAllByNum();
		foreach($dbMapping as &$vehicle) {
			$vehicle['vehicle'] = $this->vehicleTypes->getByNumber($vehicle['num']);
		}
		unset($vehicle);
		ksort($dbMapping);
		
		if($saveConfig) {
			$twigLoader = new \Twig\Loader\FilesystemLoader(__DIR__.'/../templates');
			$twig = new \Twig\Environment($twigLoader);
			$twig->addExtension(new Twig_Extensions_Extension_Date());
			
			$vehiclesHtml = $twig->render('vehicles.html', [
				'lines' => $lines,
				'vehicles' => $vehicles,
				'prefix' => $saveConfig['prefix'],
				'mapping' => $dbMapping,
			]);
			if(!file_put_contents($saveConfig['result_vehicles_temp'], $vehiclesHtml)) {
				throw new Exception('Vehicles save failed');
			}
			rename($saveConfig['result_vehicles_temp'], $saveConfig['result_vehicles']);
		}
		
		return $lines;
	}
}