<?php

class Solicitacao_Model_Tarefa extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Solicitacao_Model_Row_Tarefa';
	protected $_schema = 'solicitacao';
	protected $_name = 'tarefa';
	protected $_primary = 'id';
	public $_order = 'dt_criacao desc';

	/**
	 * Salva uma solicitacao
	 *
	 * @param array $values
	 * @param array $file
	 */
	public function save($values, $file=false) {
		$Log = new Solicitacao_Model_TarefaLog();
		$Funcionario = new Sistema_Model_Funcionarios();
		$TarefaPrioridade = new Solicitacao_Model_TarefaPrioridade();
		$ModelDepartamento = new Sistema_Model_Departamentos();

		$message = array();
		$destinatarios = array();
		$fl_executor_notificado = false;

		$Old = ($values['id'] ? $this->find($values['id'])->current() : false);

		if ($Old) {
			$New = $this->_edit($Old, $values, $file);
			$destinatarios[] = $New->id_usuario_alteracao;
			$destinatarios[] = $Old->id_usuario_criacao;
			$fl_nova = false;
		} else {
			$New = $this->_add($values, $file);
			$message[] = "Criou uma solicitação";
			$destinatarios[] = $New->id_usuario_criacao;
			$fl_nova = true;
		}

		$saved = true;

		if ($Old) {
			$destinatarios[] = $Old->id_usuario_criacao;

			if ($Old->id_executor != $New->id_executor) {
				$AntigoExecutor = ($Old->id_executor ? $Funcionario->getNomeUsuarioByIdUsuario($Old->id_executor) : '');
				$NovoExecutor = $Funcionario->getNomeUsuarioByIdUsuario($New->id_executor);

				if ($Old->id_executor == null && ($New->id_executor == $this->_user->id)){
					$message[] = "Assumiu a tarefa";

				} elseif ($Old->id_executor == null && ($New->id_executor != $this->_user->id)){
					$message[] = "Delegou a tarefa para $NovoExecutor";
					$destinatarios[] = $New->id_executor;
					$New->fl_lido = 0;

				} elseif (($Old->id_executor != null) && ($New->id_executor == $this->_user->id)){
					$message[] = "Assumiu a tarefa que estava sob os cuidados de $AntigoExecutor";
					$destinatarios[] = $Old->id_executor;
					$fl_executor_notificado = true;

				} else {
					$message[] = "Transferiu a tarefa de $AntigoExecutor para $NovoExecutor";
					$destinatarios[] = $Old->id_executor;
					$destinatarios[] = $New->id_executor;
					$New->fl_lido = 0;
				}
			}

			if ($Old->id_status != $New->id_status){
				if (Agro_Util::getStatusChave($New->id_status) == "FINALIZADO"){
					$data = new Zend_Date();

					$message[] = "Finalizou a tarefa em ".$data->get("dd/MM/yyyy HH:mm:ss");
					$New->data_termino = $data->get(Zend_Date::W3C);
					$New->fl_lido = 0;

				} else {
					$message[] = "Alterou o status de ".Agro_Util::getStatus($Old->id_status)." para ".Agro_Util::getStatus($New->id_status);
					$New->data_termino = null;
				}
			}

			if ($Old->id_prioridade != $New->id_prioridade){
				$message[] = "Alterou a prioridade de ".$TarefaPrioridade->getLabelById($Old->id_prioridade)." para ".$TarefaPrioridade->getLabelById($New->id_prioridade);
			}

			if ($Old->fl_lido == false and $New->fl_lido == true){
				$message[] = "Visualizou a solicitação";
			}
		}

		if(count($message)){
			$destinatarios = array_unique($destinatarios);

			$msg = "<b>".$New->ds_titulo."</b><br><br>";
			$msg.= "<u>".$Funcionario->getNomeUsuarioByIdUsuario($this->_user->id)."</u><br/>";
			$msg.= "<ul><li>".implode("</li><li>", $message)."</li></ul>";

			$Departamento = $ModelDepartamento->find($New->id_departamento)->current();
			$Responsavel = $Departamento->responsavel();

			if (in_array($Responsavel["id_usuario"], $destinatarios)){
				unset($destinatarios[$Responsavel["id_usuario"]]);
			}

			if ($Old) {
				$criador = $Funcionario->getFuncionarioByIdUsuario($Old->id_usuario_criacao);
			} else {
				$criador = $Funcionario->getFuncionarioByIdUsuario($New->id_usuario_criacao);
			}

			$destinatarios[] = 1008;//toni
			$destinatarios[] = 2530;//fabio
			if (in_array($criador->id_departamento, array(20, 26))) { // atendimento e técnica
				$destinatarios[] = 1032;//karina silva
				$destinatarios[] = 2881;//henrique
			}

			if($fl_nova){
			    $tipo_tipo = "Nova";
			} else {
			    $tipo_tipo = "Alteração na";
			}

			Agro_Util::setNotificacao($tipo_tipo." solicitação N°: {$New->id}", $msg, $Responsavel["ds_email"], $destinatarios);

			$Log->insert(array(
				"id_tarefa" => $New->id,
				"ds_descricao" => $msg,
				"fl_criador_notificado" => 1,
				"fl_executor_notificado" => ($fl_executor_notificado ? 1 : 0)
				)
			);

			$saved = $New->save();
		}

		return $saved;
	}

	/**
	 * Altera uma solicitacao
	 *
	 * @param object $Old
	 * @param array $values
	 * @param array $file
	 */
	private function _edit($Old, $values, $file) {
		try{
			$New = $this->find($values['id'])->current();

			$New->id_status 		= ($values['id_status'] 	  ? $values['id_status'] 		: $New->id_status);
			$New->id_departamento 	= ($values['id_departamento'] ? $values['id_departamento'] 	: $New->id_departamento);
			$New->id_tarefa_tipo 	= ($values['id_tarefa_tipo']  ? $values['id_tarefa_tipo'] 	: $New->id_tarefa_tipo);
			$New->id_prioridade 	= ($values['id_prioridade']   ? $values['id_prioridade'] 	: $New->id_prioridade);
			$New->id_executor 		= ($values['id_executor'] 	  ? $values['id_executor'] 		: $New->id_executor);
			$New->ds_descricao 		= ($values['ds_descricao'] 	  ? $values['ds_descricao'] 	: $New->ds_descricao);
			//$New->ds_arquivo 		= ($file 					  ? $file['new_name'] 			: $New->ds_arquivo);
			$New->ds_titulo 		= ($values['ds_titulo'] 	  ? $values['ds_titulo'] 		: $New->ds_titulo);
			$New->fl_del 			= (array_key_exists('fl_del', $values) ? $values["fl_del"] : 0);

			$New->save();

			return $New;

		} catch (Exception $e) {
			throw new Exception($e->getMessage());
		}
	}

	/**
	 * Cria uma solicitacao
	 *
	 * @param array $values
	 * @param array $file
	 */
	private function _add($values, $file) {
		try {
			$New = $this->createRow();

			$New->id_status 		= $this->getIdStatus('ABERTO', 'SOLICITACAO');
			$New->id_departamento 	= $values['id_departamento'];
			$New->id_tarefa_tipo 	= $values['id_tarefa_tipo'];
			$New->id_prioridade 	= $values['id_prioridade'];
			$New->id_executor 		= $values['id_executor'];
			$New->ds_descricao 		= $values['ds_descricao'];
			//$New->ds_arquivo 		= ($file ? $file['new_name']: null);
			$New->ds_titulo 		= $values['ds_titulo'];
			$New->fl_del 		    = 0;

			if ($New->save() && count($file)) {
                            $Arquivos = new Solicitacao_Model_TarefaArquivos();
                            foreach($file as $f) {
                                $data['id_tarefa'] = $New->id;
                                $data['ds_nome_arquivo'] = $f['new_name'];
                                $Arquivos->save($data);
                            }
                        }

			return $New;

		} catch (Exception $e) {
			throw new Exception($e->getMessage());
		}
	}

	/**
	 * Busca as tarefas que o usuario logado e o executor
	 */
	public function executor($params) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('t' => 'solicitacao.tarefa'));
		$Select->join(array('p' => 'solicitacao.tarefa_prioridade'), 't.id_prioridade = p.id', 'ds_nome_prioridade');
		$Select->join(array('o' => 'solicitacao.tarefa_tipo'), 't.id_tarefa_tipo = o.id', 'ds_nome_tipo');
		$Select->where('id_status != ?', $this->getIdStatus('FINALIZADO', 'SOLICITACAO'));
		$Select->where('id_executor = ?', $this->_user->id);
		$Select->where('t.fl_del is false');
		$Select->order(array('t.dt_criacao'));

		return 	$this->getPaginator($Select, $params['page'], 20);
	}

	/**
	 * Busca as tarefas que o usuario logado criou
	 */
	public function criador($params) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('t' => 'solicitacao.tarefa'));
		$Select->join(array('p' => 'solicitacao.tarefa_prioridade'), 't.id_prioridade = p.id', 'ds_nome_prioridade');
		$Select->join(array('o' => 'solicitacao.tarefa_tipo'), 't.id_tarefa_tipo = o.id', 'ds_nome_tipo');
		$Select->where('t.id_status != ?', $this->getIdStatus('FINALIZADO', 'SOLICITACAO'));
		$Select->where('t.id_usuario_criacao = ?', $this->_user->id);
		$Select->where('t.fl_del is false');
		$Select->order(array('t.dt_criacao'));

		return 	$this->getPaginator($Select, $params['page'], 20);
	}

	/**
	 * Busca as tarefas que o usuario logado ja finalizou
	 */
	public function finalizadas($params) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->where('id_status = ?', $this->getIdStatus('FINALIZADO', 'SOLICITACAO'));
		$Select->where('id_usuario_criacao = ? or id_executor = ?', $this->_user->id);
		$Select->where('fl_del is false');
		$Select->order('id desc');

		return 	$this->getPaginator($Select, $params['page'], 20);
	}

	/**
	 * Busca as tarefas que o usuario logado ja finalizou
	 */
	public function notificacoes() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('t' => 'solicitacao.tarefa'), array('ds_titulo'));
		$Select->join(array('l' => 'solicitacao.tarefa_log'), 't.id = l.id_tarefa', array('id','ds_descricao'));
		$Select->where('t.id_status != ?', $this->getIdStatus('FINALIZADO', 'SOLICITACAO'));
		$Select->where('t.id_usuario_criacao = ? or id_executor = ?', $this->_user->id);
		$Select->where('l.fl_executor_notificado is false');
		$Select->where('l.fl_criador_notificado is false');

		return $this->fetchAll($Select);
	}

	/**
	 * Assumir a tarefa
	 */
	public function assumir($params) {
		$dados = $params;

		$User = Zend_Auth::getInstance()->getIdentity();

		$dados['id_executor'] = ($params['id_executor'] ? $params['id_executor'] : $User->id);
		return $this->save($dados);
	}

	/**
	 * Busca as tarefas em aberto de um departamento
	 */
	public function departamento($id) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('t' => 'solicitacao.tarefa'), array('id','ds_titulo'));
		$Select->join(array('p' => 'solicitacao.tarefa_prioridade'), 't.id_prioridade = p.id', 'ds_nome_prioridade');
		$Select->join(array('o' => 'solicitacao.tarefa_tipo'), 't.id_tarefa_tipo = o.id', 'ds_nome_tipo');
		$Select->join(array('s' => 'sistema.status'), 's.id = t.id_status', 'ds_status');
		$Select->join(array('c' => 'sistema.usuarios'), 'c.id = t.id_usuario_criacao', false);
		$Select->join(array('cf' => 'sistema.funcionarios'), 'c.id = cf.id_usuario', 'ds_nome_funcionario as solicitante');
		$Select->join(array('e' => 'sistema.usuarios'), 'e.id = t.id_executor', false);
		$Select->join(array('ef' => 'sistema.funcionarios'), 'e.id = ef.id_usuario', 'ds_nome_funcionario as executor');
		$Select->where('t.id_status != ?', $this->getIdStatus("FINALIZADO", "SOLICITACAO"));
		$Select->where('cf.id_departamento = ?', $id);
		$Select->where('t.fl_del is false');
		$Select->order(array('o.vl_ordem', 'p.vl_ordem', 't.dt_criacao'));

		return 	$this->fetchAll($Select)->toArray();
	}

}
