<?php

class Atendimento_Model_TipoChamado extends Agro_Db_Table_Abstract {
    const AGRO_PROR_PARC = 16;

    const ATENDIMENTO_PENDENCIA = 1;
    const ATENDIMENTO_PROPOSTA_FISICA = 86;

    const CORRETOR_AGENDAMENTO_VISTORIA = 20;
    const CORRETOR_AVISO_INICIO_COLHEITA_CURA = 24;
    const CORRETOR_CANCELAMENTO_AVISO_PROCESSO = 23;
    const CORRETOR_LIQUIDACAO_INDENIZACAO = 22;
    const CORRETOR_NOVA_AVALIACAO = 37;
    const CORRETOR_PARCELAS_EM_ABERTO = 41;
    const CORRETOR_PENDENCIA_DOCUMENTOS_SINISTRO = 19;
    const CORRETOR_PREVISAO_PAGAMENTO = 21;
    const CORRETOR_QUESTIONARIO = 44;
    const CORRETOR_SUPORTE_AGRONET = 25;
    const CORRETOR_VALOR_INDENIZACAO = 47;
    const CORRETOR_VISTORIA_FINAL_ANTECIPADA = 26;

    const SEGURADORA_CANCELAMENTO_AVISO_PROCESSO = 35;
    const SEGURADORA_DECLARACAO_DOCUMENTOS = 31;
    const SEGURADORA_EXCLUSAO_LIQUIDACAO = 69;
    const SEGURADORA_LIQUIDACAO_INDENIZACAO = 34;
    const SEGURADORA_NOVA_AVALIACAO = 38;
    const SEGURADORA_PENDENCIAS_DOCUMENTOS = 32;
    const SEGURADORA_PREVISAO_PAGAMENTO = 33;
    const SEGURADORA_VALOR_INDENIZACAO = 48;
    const SEGURADORA_PARCELAS_ABERTO = 42;
    const SEGURADORA_SOLICITACAO_LAUDOS = 46;
    const SEGURADORA_SUPORTE_AGRONET = 36;

    const SINISTRO_CONFIRMAR_CONTATO_VISTORIADOR = 112;
    const SINISTRO_CONFIRMAR_CONTATO_CORRETOR = 113;

    const TECNICA_CANCELAMENTO_INADIMP = 89;
    const TECNICA_CONFIRMAR_CONTATO = 92;
    const TECNICA_PARCELA_ABERTO = 93;
    const TECNICA_PROR_PARC = 65;
    const TECNICA_SUBST_CONTRATO = 90;

    const VISTORIADOR_AGENDAMENTO_VISTORIA = 29;
    const VISTORIADOR_CANCELAMENTO_AVISO_PROCESSO = 45;
    const VISTORIADOR_CORRECAO_LAUDO = 40;
    const VISTORIADOR_DECLARACAO_PERICIA = 28;
    const VISTORIADOR_DIGITACAO_LAUDOS = 43;
    const VISTORIADOR_NOVA_AVALIACAO = 39;
    const VISTORIADOR_SOLICITACAO_LAUDOS = 27;
    const VISTORIADOR_SUPORTE_AGRONET = 30;

    const VISTORIADOR_CONFIRMAR_CONTRATO = 112;
    const PENDENCIA_VISTORIA = 114;
    const COMUNICADO_ALTERACAO = 84;

    const VISTORIA_PREVIA_COMUNICADO_ALTERACAO = 96;
    const VISTORIA_PREVIA_CONFIRMAR_CONTATO = 92;
    const VISTORIA_PREVIA_PENDENCIA = 68;

	protected $_schema = 'atendimento';
	protected $_name = 'tipo_chamado';
	protected $_primary = 'id';

	public function save(array $data) {
        try {
          
            $Row = $this->getRow($data['id']);
            
            $Row->ds_tipo_chamado = $data['ds_tipo_chamado'];
            $Row->ds_chave = $data['ds_chave'];
            $Row->id_departamento = $data['id_departamento'];
            $Row->id_responsavel = empty($data['id_responsavel']) ? null : $data['id_responsavel'];
            $Row->fl_destinatario_corretor = $data['fl_destinatario_corretor'] ? '1' : '0'; 
            $Row->fl_destinatario_empresa_vistoria = $data['fl_destinatario_empresa_vistoria'] ? '1' : '0';
            $Row->fl_destinatario_seguradora = $data['fl_destinatario_seguradora'] ? '1' : '0';
            $Row->fl_anexar_arquivo_destinatario = $data['fl_anexar_arquivo_destinatario'] ? '1' : '0';
            $Row->fl_anexar_arquivo_interno = $data['fl_anexar_arquivo_interno'] ? '1' : '0';
            $Row->fl_criar_chamado_destinatario = $data['fl_criar_chamado_destinatario'] ? '1' : '0'; 
            $Row->prazo_dias_uteis = (!empty($data['prazo_dias_uteis'])) ? $data['prazo_dias_uteis'] : null;
            $Row->ds_identificacao_tipo_chamado = $data['ds_identificacao_tipo_chamado'] ?? null;

            return $Row->save();
        } catch (\Throwable $th) {
            $this->setMessage($th->getMessage());
            return false;
        }
	}

	public function getData($where=false) {

        $destinatarios = " RTRIM((CASE WHEN tc.fl_destinatario_corretor is TRUE THEN 'Corretor,' ELSE '' END ||
        CASE WHEN tc.fl_destinatario_empresa_vistoria is TRUE THEN ' Empresa Vistoria,' ELSE '' END ||
        CASE WHEN tc.fl_destinatario_seguradora is TRUE THEN ' Seguradora,' ELSE '' END), ',') AS destinatarios ";

		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$select->from(
            array('tc' => 'atendimento.tipo_chamado'),
            array('tc.id','tc.id_responsavel','tc.ds_tipo_chamado','tc.ds_chave','tc.fl_ativo', 'tc.fl_destinatario_corretor', 
                  'tc.fl_destinatario_empresa_vistoria', 'tc.fl_destinatario_seguradora', $destinatarios
            )
        );
		$select->joinLeft(array('d' => 'sistema.departamentos'), 'tc.id_departamento = d.id', array('d.ds_nome_departamento'));
		$select->joinLeft(array('u' => 'sistema.usuarios'), 'tc.id_responsavel = u.id', array('u.ds_nome_usuario'));
		$select->order($this->_order);

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

					$select->where("$field $operator ?", $value);

				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		return $select;
	}

	public function getIdTipoChamado($chave, $id_departamento='') {
		if ($id_departamento != '') {
			$Row = $this->fetchRow("ds_chave = '$chave' and fl_ativo is true and fl_del is false and id_departamento = $id_departamento");
		} else {
			$Row = $this->fetchRow("ds_chave = '$chave' and fl_ativo is true and fl_del is false");
		}
		return $Row->id;
	}

	public function getIdResponsavel($id) {
		$Row = $this->fetchRow("id = $id");
		return $Row->id_responsavel;
	}

	public function getComboTipoChamado(
        $idDepartamento = null,
        $temVP = true,
        $cdStatusProposta = 1,
        $flagTelaCadastroChamado = false
    ) {
		$User = Zend_Auth::getInstance()->getIdentity();
        $modelChamadoDestinatario = new Atendimento_Model_ChamadoDestinatario();
        $modelUsuarios = new Sistema_Model_Usuarios();

		$select = $this->select()->order('ds_tipo_chamado');

        $user = Zend_Auth::getInstance()->getIdentity();
    
        $isUsuarioLogadoDestinatario = $user->tp_usuario !== Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO;
        
        if ($flagTelaCadastroChamado && $isUsuarioLogadoDestinatario) {
            $select->where('fl_criar_chamado_destinatario IS true');
        }

		if($idDepartamento) {
			$select->where('id_departamento = ?', $idDepartamento);

			//se a proposta não tem vistoria prévia, não aparece a opção de prorrogação de data 
			if($idDepartamento == Sistema_Model_Departamentos::AGRO_TECNICA && !$temVP){
				$select->where("ds_chave != 'VP_PRORROGACAO_DATA' OR ds_chave IS NULL");
			}
		}

		//mostra somente quando for orçamento ou quando é para trazer todos
		if ($cdStatusProposta != 1) {
			$select->where("ds_chave != 'BOLETO_AVULSO' OR ds_chave IS NULL");
		}
        
		if (!$modelUsuarios->isFuncionarioAgro($User->id)) {
		    $tiposChamadosSomenteAgro = [
                self::ATENDIMENTO_PROPOSTA_FISICA,
                self::TECNICA_PARCELA_ABERTO,
                self::VISTORIA_PREVIA_COMUNICADO_ALTERACAO
            ];
            
            $select->where("id not in (" . implode(', ', $tiposChamadosSomenteAgro) . ")");
    
            switch($modelChamadoDestinatario->getDestinatarioLogado()) {
                case Atendimento_Model_ChamadoDestinatario::DESTINATARIO_CORRETOR:
                    $select->where("fl_destinatario_corretor is true");
                    break;
                case Atendimento_Model_ChamadoDestinatario::DESTINATARIO_SEGURADORA:
                    $select->where("fl_destinatario_seguradora is true");
                    break;
                case Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA:
                    $select->where("fl_destinatario_empresa_vistoria is true");
                    break;
            }
        } else {
            $select->where("(fl_destinatario_corretor is true OR fl_destinatario_seguradora is true OR fl_destinatario_empresa_vistoria is true)");
        }

		$select->where('fl_ativo = true');

		$Rs = $this->fetchAll($select);

		$ret = array();
		if ($Rs->count()) {
			$ret[0] = '';
			foreach ($Rs as $Row) {
				$ret[$Row->id] = $Row->ds_tipo_chamado;
			}
		}

		return $ret;
	}

    function getComboCadastro(bool $isUsuarioLogadoDestinatario = false)
    {
        $where = 'fl_ativo = true';

        if ($isUsuarioLogadoDestinatario) {
            $where .= ' AND fl_criar_chamado_destinatario IS true'; 
        }

        $rs = $this->fetchAll(
                $where, 
                $this->_order
            )->toArray();
            
		$options = array();

		if (is_array($rs)) {
            $options[''] = '';

			foreach ($rs as $row) {
				$options[$row['id']] = $row['ds_tipo_chamado'];
			}

			return $options;
		} else {
			return false;
		}
    }
}
