<?php

class Atendimento_Model_Pendencia extends Agro_Db_Table_Abstract {
	protected $_schema = 'atendimento';
	protected $_name = 'pendencias';
	protected $_primary = 'id';
	public $_order = 'ds_nome_pendencia';

	public function save($data) {
		$Row = $this->getRow($data['id']);

		$Row->id_tipo_pendencia = $data['id_tipo_pendencia'];
		$Row->ds_nome_pendencia = $data['ds_nome_pendencia'];
		$Row->ds_chave = $data['ds_chave'];
		$Row->ds_descricao_pendencia = $data['ds_descricao_pendencia'];

		return $Row->save();
	}

	public function getData($where=false) {
		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$select->from(array('p' => 'atendimento.pendencias'), array('*','(select count(1) from seguro.propostas_pendencias pp where pp.id_pendencia = p.id) as id_proposta_status'));
		$select->join(array('tp' => 'atendimento.tipo_pendencia'), 'p.id_tipo_pendencia = tp.id', 'tp.ds_tipo_pendencia');

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];

					if($field == 'fl_ativo'){
						$select->where("p.fl_ativo $operator ?", $value);
					}else if($field == 'ds_chave'){
						$select->where("p.ds_chave $operator ?", $value);
					}else{
						$select->where("$field $operator ?", $value);
					}
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		return $select;
	}

	public function getPendenciasProposta($id_proposta, $tipo_pendencia = null)
    {
        $tipo = '';

        if ($tipo_pendencia) {
            $tipo = "WHERE tp.ds_chave = '{$tipo_pendencia}'";
        }

        $sql = "SELECT p.id
                     , p.ds_nome_pendencia
                     , tp.ds_tipo_pendencia
                     , sub.id_pendencia AS marcado
                     , CASE
                         WHEN sub.id_pendencia IS NULL AND p.fl_ativo IS FALSE
                           THEN false
                           ELSE true
                        END AS mostrar_pendencia
				 FROM atendimento.pendencias AS p
				      INNER JOIN atendimento.tipo_pendencia AS tp ON p.id_tipo_pendencia = tp.id
				      LEFT JOIN (SELECT pp.id_pendencia
   					               FROM seguro.propostas_pendencias AS pp
   					                    JOIN seguro.propostas_status AS ps ON pp.id_proposta_status = ps.id
   					                                                      AND ps.fl_ativo = true
   					                                                      AND ps.id_proposta = $id_proposta
   					              GROUP BY id_pendencia, ps.id) AS sub ON p.id = sub.id_pendencia
				{$tipo}
                ORDER BY p.ds_nome_pendencia";

        return $this->_db->query($sql);
    }

	public function getPendenciasDocFisico($id_proposta, $tipo_pendencia = null)
    {
        if ($tipo_pendencia) {
            $tipo = "WHERE tp.ds_chave = '$tipo_pendencia'";
        }

        $sql = "SELECT p.id
                     , p.ds_nome_pendencia
                     , tp.ds_tipo_pendencia
                     , sub.id_pendencia AS marcado
                     , CASE
                         WHEN sub.id_pendencia IS NULL AND p.fl_ativo IS FALSE
                           THEN false
                           ELSE true
                        END AS mostrar_pendencia
				 FROM atendimento.pendencias AS p
				      INNER JOIN atendimento.tipo_pendencia AS tp ON p.id_tipo_pendencia = tp.id
				      LEFT JOIN (SELECT pp.id_pendencia
						           FROM seguro.propostas_pendencias_documento_fisico AS pp   
							            JOIN seguro.propostas_status_doc_fisico AS ps ON pp.id_proposta_status_doc_fisico = ps.id
							                                                         AND ps.fl_ativo = true
							                                                         AND ps.id_proposta=$id_proposta
						          GROUP BY id_pendencia, ps.id) AS sub ON p.id = sub.id_pendencia
				$tipo
				ORDER BY p.ds_nome_pendencia";

        return $this->_db->query($sql);
    }

	public function getPendenciasDocDigitalizado($id_proposta)
    {
		$sql = "SELECT p.id
                     , p.ds_nome_pendencia
                     , tp.ds_tipo_pendencia
                     , sub.id_pendencia AS marcado
                     , CASE
                         WHEN sub.id_pendencia IS NULL AND p.fl_ativo IS FALSE
                           THEN false
                           ELSE true
                        END AS mostrar_pendencia
				 FROM atendimento.pendencias AS p 
					  INNER JOIN atendimento.tipo_pendencia AS tp ON p.id_tipo_pendencia = tp.id 
					  LEFT JOIN (SELECT pp.id_pendencia
						           FROM seguro.propostas_pendencias_documento_digitalizado AS pp   
						                INNER JOIN seguro.propostas_status_documento_digitalizado AS ps ON pp.id_proposta_status_documento_digitalizado = ps.id 
							                                                              AND ps.fl_ativo = true 
							                                                              AND ps.id_proposta={$id_proposta}
						          GROUP BY id_pendencia, ps.id
					) AS sub ON p.id = sub.id_pendencia
				WHERE tp.ds_chave = 'PENDENCIA_DOCUMENTOS_DIGITALIZADOS_PROPOSTA'
				ORDER BY p.ds_nome_pendencia";

		return Zend_Db_Table::getDefaultAdapter()->fetchAll($sql);
	}

	public function getPazoPendencias($id_proposta){
		$result = array();

		$PropostaPendencia = new Atendimento_Model_PropostaPendencia();

		$id_proposta_status = $PropostaPendencia->getIdStatusProposta($id_proposta);

		$PropostaStatus = new Seguro_Model_PropostaStatus();

		if ($id_proposta_status) {
			$Status = $PropostaStatus->find($id_proposta_status)->current();
			$result['ds_observacao'] = $Status->ds_observacao;
		}

		$Pendencias = $PropostaPendencia->fetchRow("id_proposta_status = $id_proposta_status");

		$result['dt_prazo'] = Agro_Util::formatDate($Pendencias['dt_prazo'], Zend_Date::DATES);
		$result['hr_prazo'] = $Pendencias['hr_prazo'];

		return $result;

	}

	public function getPendencias($id) {
		if (!is_array($id)) {
			$id = array($id);
		}

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'atendimento.pendencias'));
		$Select->where('id in ('.implode(',', $id).')');
        $Select->where('ds_chave <> ?', 'OUTRAS_PENDENCIAS_DE_PERITO');

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

	public function setPendenciasProposta($idPendencias, $idProposta, $prazo, $hora) {
		$PropostasPendencias = new Atendimento_Model_PropostaPendencia();
		$idStatusProposta = $PropostasPendencias->getIdStatusProposta($idProposta);

		if (!is_array($idPendencias)) {
			$idPendencias = array($idPendencias);
		}

		$this->getAdapter()->beginTransaction();

		try {
			$PropostasPendencias->delete($idStatusProposta, 'id_proposta_status');
			foreach ($idPendencias as $idPendencia) {
				$PropostasPendencias->save(array(
					'id_proposta_status' => $idStatusProposta,
					'id_pendencia' => $idPendencia,
					'dt_prazo' => $prazo,
					'hr_prazo' => $hora
				));
			}

			$this->getAdapter()->commit();
			return $idStatusProposta;
		} catch (Exception $e) {
			$this->getAdapter()->rollBack();
			return false;
		}
	}

    public function getComboPendenciasByTipo(int $idTipoPendencia, bool $somenteAtivas = false) : array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['p' => "{$this->_schema}.{$this->_name}"], ['id', 'ds_nome_pendencia']);
        $select->where('id_tipo_pendencia = ?', $idTipoPendencia);

        if ($somenteAtivas) {
            $select->where('fl_ativo is true');
        }

        $rs = $this->fetchAll($select)->toArray();
        $pendencias = [];

        foreach ($rs as $registro) {
            $pendencias[$registro['id']] = $registro['ds_nome_pendencia'];
        }

        asort($pendencias);

        return $pendencias;
    }
}
