<?php

class Image
{

	/**
	 *
	 * @param string $path
	 * @return mix string-base64 or false
	 */
	public static function toBase64($path)
	{
		if ($path) {
			$type = pathinfo($path, PATHINFO_EXTENSION);

			if (!$type) {
				return FALSE;
			}

			$data = file_get_contents($path);

			return $data ? 'data:image/' . $type . ';base64,' . base64_encode($data) : FALSE;
		}

		return FALSE;
	}

	/**
	 * Создаёт все требуемые размеры изображения и раскладывает их по папкам.
	 * @param type $imgName
	 */
	public static function createAllSizes($imgName, $noWatermark = false, $folder = '')
	{
		$sizes = App::getConfig('images');
		$pathInfo = pathinfo($_SERVER['SCRIPT_FILENAME']);
		$uploaddir = $pathInfo['dirname'] . '/photos/' . $folder;
		$watermarkDir = App::getBasedir() . 'watermarks/';

		foreach ($sizes as $dir => $size) {
			$watermark = isset($size[3]) ? $watermarkDir . $size[3] : '';
			$watermark = $noWatermark ? '' : $watermark;

			self::imgResize(
					$uploaddir . $imgName, // Source - original image
					$uploaddir . $dir . '/' . $imgName, // Destination
					$size[0], // X
					$size[1], // Y
					$size[2], // Quality
					$watermark// Watermark
			);
		}

		return TRUE; // o_O
	}

	public static function createCustomSize($imgFullName, $x, $y)
	{
		self::imgResize(
				$imgFullName, null, $x, $y
		);
	}

	/**
	 *  Функция img_resize(): генерация thumbnails
	 *  Параметры:
	 *  $src             - имя исходного файла
	 *  $dest            - имя генерируемого файла
	 *  $width, $height  - ширина и высота генерируемого изображения, в пикселях
	 *  Необязательные параметры:
	 *  $quality         - качество генерируемого JPEG, по умолчанию 90; максимальное 100;
	 */
	private static function imgResize($src, $dest, $width, $height, $quality = 90, $watermark = '')
	{
		if (!file_exists($src))
			return false;

		$size = getimagesize($src);

		if ($size === false)
			return false;

		// Определяем исходный формат по MIME-информации, предоставленной
		// функцией getimagesize, и выбираем соответствующую формату
		// imagecreatefrom-функцию.
		$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
		$icfunc = "imagecreatefrom" . $format;
		if (!function_exists($icfunc))
			return false;

		$x_ratio = $width / $size[0];
		$y_ratio = $height / $size[1];

		$ratio = max($x_ratio, $y_ratio);
		$use_x_ratio = ($x_ratio == $ratio);

		$new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
		$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
		$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
		$new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);

		$isrc = $icfunc($src);
		$idest = imagecreatetruecolor($width, $height);

		imagefill($idest, 0, 0, 0xFFFFFF);
		imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);

		if ($watermark) {
			$stamp = imagecreatefrompng($watermark);

			$marge_right = 10;
			$marge_bottom = 2;
			$sx = imagesx($stamp);
			$sy = imagesy($stamp);

			imagecopy($idest, $stamp, imagesx($idest) - $sx - $marge_right, imagesy($idest) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
		}
		//$iofunct = "image".$format;
		//$iofunct($idest, $dest, $quality);
		if ($dest) {
			imagejpeg($idest, $dest, $quality);
		} else {
			header('Content-Type: image/jpeg');
			imagejpeg($idest);
			die;
		}

		imagedestroy($isrc);
		imagedestroy($idest);

		return true;
	}

}
