<?php

ApplicationSettings::RegisterDefaultSetting("images", "upload_location", "image_uploads");
ApplicationSettings::RegisterDefaultSetting("images", "thumbnail_width", "480");
ApplicationSettings::RegisterDefaultSetting("images", "thumbnail_height", "360");

if (!file_exists(ApplicationSettings::GetSetting("images", "upload_location")))
	mkdir(ApplicationSettings::GetSetting("images", "upload_location"));

class Image extends DBObject implements JsonSerializable {

	public $Path, $ThumbnailPath;
	private $Filename, $TempFile;

	public static function IsValidType($ext) {
		// use a switch because it's quicker than a loop
		switch (strtolower($ext)) {
			case "bmp":
			case "dib":
			case "jpeg":
			case "jpg":
			case "jpe":
			case "jfif":
			case "gif":
			case "tif":
			case "tiff":
			case "png":
			case "ico":
				return true;
			default:
				return false;
		}
	}

	public function __construct($id=0, $tempFile="") {
		if (!is_numeric($id)) {
			$this->Filename=$id;
			$this->TempFile=$tempFile;
			$id=0;
		}
		parent::__construct("images", "image_id", $id);

		if ($this->ImageId)
			$this->CalculatePaths();
	}

	private function CalculatePaths() {
		$dir=ApplicationSettings::GetSetting("images", "upload_location");
		$info=pathinfo($this->ImageFilename);
		$this->Path=$dir.'/'.$this->ImageFilename;
		$this->ThumbnailPath=$dir.'/'.$info['filename'].'.thumbnail.'.$info['extension'];
	}

	private function MakeFileName() {
		return $this->ImageId."_".Utils::MakeStringUrlSafe($this->Filename);
	}

	public function Save() {
		$newSave=!$this->ImageId;
		parent::Save();
		if ($newSave&&$this->ImageId) {
			$this->ImageFilename=$this->MakeFileName();
			$this->CalculatePaths();
			if (!move_uploaded_file($this->TempFile, $this->Path))
				throw new Exception("Unable to move uploaded file: ".$this->Path.', '.$this->TempFile);

			if (class_exists("Imagick")) {
				$thumb=new Imagick($this->Path);
				$height=ApplicationSettings::GetSetting("images", "thumbnail_height");
				$width=ApplicationSettings::GetSetting("images", "thumbnail_width");
				$thumb->scaleImage(0, $height);
				$thumb->scaleImage($width, 0);
				$thumb->writeImage($this->ThumbnailPath);
				$thumb->clear();
				$thumb->destroy();
			} else
				copy($this->Path, $this->ThumbnailPath);
			parent::Save();
		}
	}

	public function jsonSerialize() {
		$obj=parent::jsonSerialize();
		$obj->ThumbnailPath=$this->ThumbnailPath;
		$obj->Path=$this->Path;
		return $obj;
	}

}
