<?php defined('SYSPATH') or die('No direct access allowed.');

/**
 * Mark all accounts that have no outstanding invoices and active services as disabled.
 *
 * @package    Photo
 * @category   Controllers
 * @author     Deon George
 * @copyright  (c) 2014 Deon George
 * @license    http://dev.leenooks.net/license.html
 */
class Controller_Photo extends Controller_TemplateDefault {
	public function action_index() {
	}

	public function action_details() {
		$po = ORM::factory('Photo',$this->request->param('id'));
		if (! $po->loaded())
			HTTP::redirect('index');

		Block::factory()
			->title('Details for Photo:'.$po->id)
			->body(Debug::vars($po->info()));
	}

	public function action_duplicate() {
		$output = '';

		// Update the current posted photos.
		if ($this->request->post())
			foreach ($this->request->post('process') as $pid) {
				$po = ORM::factory('Photo',$pid);

				$po->duplicate = Arr::get($this->request->post('duplicate'),$pid);
				$po->delete = Arr::get($this->request->post('delete'),$pid);
				$po->flag = Arr::get($this->request->post('flag'),$pid);

				$po->save();
			}

		$p = ORM::factory('Photo');

		if ($x=$this->request->param('id'))
			$p->where('id','=',$x);

		else
			$p->where('duplicate','=',TRUE)
				->where_open()
				->where('delete','!=',TRUE)
				->or_where('delete','is',NULL)
				->where_close();

		$output .= Form::open(sprintf('%s/%s',strtolower($this->request->controller()),$this->request->action()));

		foreach ($p->find_all() as $po) {
			$dp = $po->duplicate_find()->find_all();

			// Check that there are still duplicates
			if ($dp->count() == 0) {
				$po->duplicate = NULL;
				$po->save();
				continue;
			}

			$output .= Form::hidden('process[]',$po->id);
			foreach ($dp as $dpo)
				$output .= Form::hidden('process[]',$dpo->id);

			$output .= '<table class="table table-striped table-condensed table-hover">';

			foreach (array(
				'ID'=>array('key'=>'id','value'=>HTML::anchor('/photo/details/%VALUE%','%VALUE%')),
				'Thumbnail'=>array('key'=>'id','value'=>HTML::anchor('/photo/view/%VALUE%',HTML::image('photo/thumbnail/%VALUE%'))),
				'Signature'=>array('key'=>'signature'),
				'Date Taken'=>array('key'=>'date_taken()'),
				'Filename'=>array('key'=>'filename'),
				'Proposed Name'=>array('key'=>'path()'),
				'Width'=>array('key'=>'width'),
				'Height'=>array('key'=>'height'),
				'Orientation'=>array('key'=>'orientation'),
				'Make'=>array('key'=>'make'),
				'Model'=>array('key'=>'model'),
			) as $k=>$v)
				$output .= $this->table_duplicate_details($dp,$po,$v['key'],$k,Arr::get($v,'value','%VALUE%'));

			foreach (array(
				'Flag'=>array('key'=>'id','value'=>'flag'),
				'Duplicate'=>array('key'=>'id','value'=>'duplicate'),
				'Delete'=>array('key'=>'id','value'=>'delete'),
			) as $k=>$v)
				$output .= $this->table_duplicate_checkbox($dp,$po,$v['key'],$k,Arr::get($v,'value','%VALUE%'));

			$output .= '</table>';

			break;
		}

		$output .= '<div class="row">';
		$output .= '<div class="offset2">';
		$output .= '<button type="submit" class="btn btn-primary">Save changes</button>';
		$output .= '<button type="button" class="btn">Cancel</button>';
		$output .= '</div>';
		$output .= '</div>';

		$output .= Form::close();

		Block::factory()
			->title('Duplicate Photo:'.$po->id)
			->title_icon('icon-edit')
			->body($output);
	}

	public function action_thumbnail() {
		// Get the file path from the request
		$po = ORM::factory('Photo',$this->request->param('id'));

		return $this->image($po->thumbnail(),$po->date_taken,$po->type(TRUE));
	}

	public function action_view() {
		$po = ORM::factory('Photo',$this->request->param('id'));

		return $this->image($po->image(),$po->date_taken,$po->type(TRUE));
	}

	private function image($content,$modified,$type) {
		// Send the file content as the response
		if ($content)
			$this->response->body($content);
		// Return a 404 status
		else
			$this->response->status(404);

		// Generate and check the ETag for this file
		if (Kohana::$environment < Kohana::TESTING OR Kohana::$config->load('debug')->etag)
			$this->check_cache(sha1($this->response->body()));

		// Set the proper headers to allow caching
		$this->response->headers('Content-Type',$type);
		$this->response->headers('Content-Length',(string)$this->response->content_length());
		$this->response->headers('Last-Modified',date('r',$modified));
		$this->auto_render = FALSE;
	}

	private function table_duplicate_checkbox(Database_MySQL_Result $dp,Model_Photo $po,$param,$title,$condition) {
		$output = '<tr>';

		$output .= sprintf('<th>%s</th>',$title);

		$output .= '<td>'.Form::checkbox($condition.'['.$po->{$param}.']',TRUE,$po->{$condition} ? TRUE : FALSE).'</td>';

		foreach ($dp as $dpo)
			$output .= '<td>'.Form::checkbox($condition.'['.$dpo->{$param}.']',TRUE,$dpo->{$condition} ? TRUE : FALSE).'</td>';

		$output .= '</tr>';

		return $output;
	}

	private function table_duplicate_details(Database_MySQL_Result $dp,Model_Photo $po,$param,$title='',$content='') {
		$output = '<tr>';

		if (preg_match('/\(/',$param) OR preg_match('/-\>/',$param))
			eval("\$d = \$po->$param;");
		else
			$d = $po->display($param);

		$output .= sprintf('<th>%s</th>',$title);
		$output .= sprintf('<td>%s</td>',$content ? str_replace('%VALUE%',$d,$content) : $d);

		foreach ($dp as $dpo) {
			if (preg_match('/\(/',$param) OR preg_match('/-\>/',$param))
				eval("\$d = \$dpo->$param;");
			else
				$d = $dpo->display($param);

			$output .= sprintf('<td>%s</td>',$content ? str_replace('%VALUE%',$d,$content) : $d);
		}

		$output .= '</tr>';

		return $output;
	}
}
?>