<?php

class Agro_Validate_DataVistoria extends Zend_Validate_Abstract {
    const INVALID_DATA_VISTORIA1     = 'dataVistoriaInvalid1';
	const INVALID_DATA_VISTORIA2     = 'dataVistoriaInvalid2';
	const INVALID_DATA_VISTORIA3     = 'dataVistoriaInvalid3';
    const INVALID_DATA_VISTORIA4     = 'dataVistoriaInvalid4';
    const INVALID_DATA_VISTORIA5     = 'dataVistoriaInvalid5';
    
    protected $_messageTemplates = array(
        self::INVALID_DATA_VISTORIA1    => "Data da vistoria não pode ser posterior a data atual.",
        self::INVALID_DATA_VISTORIA2    => "Data da vistoria não pode ser anterior ao início da safra.",
        self::INVALID_DATA_VISTORIA3    => "Não existem avisos aceitos com data anterior a da vistoria.",
        self::INVALID_DATA_VISTORIA4    => "Data de vistoria fora do período para esta vistoria. Insira uma nova vistoria para este item.",
        self::INVALID_DATA_VISTORIA5    => "Data da vistoria deve estar entre a data de início e fim de vigência da proposta.",
	);
	    
    public function isValid($value, $context = null) {

        $this->_setValue($value);
		
		$dtVistoria = new Zend_Date($value.' '.$context['dt_vistoria_hora'].':'.$context['dt_vistoria_minutos'], 'dd/MM/yyyy HH:mm');
		
		// Verifica se a data da vistoria informada não é posterior a data atual
		if ($dtVistoria->isLater(Zend_Date::now())) {
			$this->_error(self::INVALID_DATA_VISTORIA1);
			return false;
		}

		// Verifica se a data da vistoria é igual ou maior que a data de início da vigência da proposta mãe (endosso 0)
		if ($context['id_proposta']) {
            $modelPropostas = new Seguro_Model_Propostas();
            $proposta = $modelPropostas->get($context['id_proposta']);
            $isDataValida = Agro_Util::validaDataInicioFim($proposta['dt_vigencia_inicio_original'], $dtVistoria->toString('YYYY-MM-dd'));

            if (!$isDataValida) {
                $this->_error(self::INVALID_DATA_VISTORIA5);
				return false;
            }
		}

		$Coberturas = new Produto_Model_Coberturas();
		$chave_cobertura = $Coberturas->getChaveById($context['id_cobertura']);
		
		// Verifica se existem avisos disponíveis anteriores a data de vistoria informado
		$Model_Vistorias = new Sinistro2_Model_VistoriasAvisos();
		if ((!$Model_Vistorias->verifyVistoriaFinalAvisos($context['id_proposta'], $context['id_vistoria'], $dtVistoria->toString('yyyy-MM-dd HH:mm'), $context['id_cobertura'])) && ($chave_cobertura != 'COB_REPLANTIO_EXCESSO_CHUVA')){
			$this->_error(self::INVALID_DATA_VISTORIA3);
			return false;
		}

        // Caso o produto/cobertura possua vistoria preliminar, verifica se a data de vistoria informada está de acordo com o período da vistoria
        if ($context['fl_vistoria_preliminar'] && $context['id_laudo_final']) {
            $Model_LaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();
            $periodoVistoria = $Model_LaudosFinaisItensSegurados->getMinMaxDtVistoriaByIdLaudoFinal($context['id_laudo_final'], $context['id_laudo_final_item_segurado']);
            
            if ($periodoVistoria['min_dt_vistoria'] || $periodoVistoria['max_dt_vistoria']) {
                if ($periodoVistoria['min_dt_vistoria']) {
                    $min_dt_vistoria = new Zend_Date($periodoVistoria['min_dt_vistoria'], 'yyyy-MM-dd');
                    if ($min_dt_vistoria->isEarlier($dtVistoria)) {
                        $diff = ($dtVistoria->getTimestamp() - $min_dt_vistoria->getTimestamp()) / (3600 * 24);
                        if ($diff > 4) {
                            $this->_error(self::INVALID_DATA_VISTORIA4);
                            return false;
                        }
                    }
                }
                
                if ($periodoVistoria['max_dt_vistoria']) {
                    $max_dt_vistoria = new Zend_Date($periodoVistoria['max_dt_vistoria'], 'yyyy-MM-dd');
                    if ($max_dt_vistoria->isLater($dtVistoria)) {
                        $diff = ($max_dt_vistoria->getTimestamp() - $dtVistoria->getTimestamp()) / (3600 * 24);
                        if ($diff > 4) {
                            $this->_error(self::INVALID_DATA_VISTORIA4);
                            return false;
                        }
                    }
                }
                
            }
        }

        return true;
    }
}
