<?php
/*****************************************************************************
 * ViewPhoto.php
 * Contains the view photo controller
 *
 * Kabuki CMS (C) 2013-2016, Aaron van Geffen
 *****************************************************************************/

class ViewPhoto extends HTMLController
{
	private Image $photo;

	public function __construct()
	{
		// Ensure we're logged in at this point.
		$user = Registry::get('user');
		if (!$user->isLoggedIn())
			throw new NotAllowedException();

		$photo = Asset::fromSlug($_GET['slug']);
		if (empty($photo))
			throw new NotFoundException();

		$this->photo = $photo->getImage();

		Session::resetSessionToken();

		parent::__construct($this->photo->getTitle() . ' - ' . SITE_TITLE);

		if (!empty($_POST))
			$this->handleTagging();
		else
			$this->handleViewPhoto();
	}

	private function handleViewPhoto()
	{
		$page = new PhotoPage($this->photo);

		// Any (EXIF) meta data?
		$metaData = $this->prepareMetaData();
		$page->setMetaData($metaData);

		// What tag are we browsing?
		$tag = isset($_GET['in']) ? Tag::fromId($_GET['in']) : null;
		if (isset($tag))
			$page->setTag($tag);

		$this->page->adopt($page);
		$this->page->setCanonicalUrl($this->photo->getPageUrl());
	}

	private function handleTagging()
	{
		header('Content-Type: text/json; charset=utf-8');

		// Are we tagging a photo?
		if (!isset($_POST['id_tag']))
		{
			echo json_encode(['error' => true, 'msg' => 'Invalid tag request.']);
			exit;
		}

		// We are!
		if (!isset($_POST['delete']))
		{
			$this->photo->linkTags([(int) $_POST['id_tag']]);
			echo json_encode(['success' => true]);
			exit;
		}

		// ... deleting, that is.
		else
		{
			$this->photo->unlinkTags([(int) $_POST['id_tag']]);
			echo json_encode(['success' => true]);
			exit;
		}
	}

	private function prepareMetaData()
	{
		if (!($exif = EXIF::fromFile($this->photo->getFullPath())))
			throw new UnexpectedValueException('Photo file not found!');

		$metaData = [];

		if (!empty($exif->created_timestamp))
			$metaData['Date Taken'] = date("j M Y, H:i:s", $exif->created_timestamp);

		if ($author = $this->photo->getAuthor())
			$metaData['Uploaded by'] = $author->getfullName();

		if (!empty($exif->camera))
			$metaData['Camera Model'] = $exif->camera;

		if (!empty($exif->shutter_speed))
			$metaData['Shutter Speed'] = $exif->shutterSpeedFraction();

		if (!empty($exif->aperture))
			$metaData['Aperture'] = number_format($exif->aperture, 1);

		if (!empty($exif->focal_length))
			$metaData['Focal Length'] = $exif->focal_length;

		if (!empty($exif->iso))
			$metaData['ISO Speed'] = $exif->iso;

		if (!empty($exif->software))
			$metaData['Software'] = $exif->software;

		return $metaData;
	}
}