<?php

use Dompdf\Exception;

class Seguro_Model_Cotacoes extends Agro_Db_Table_Abstract {
	protected $_name = 'cotacoes';
	protected $_schema = 'seguro';
	public $_order = 'id';

	public function save(array $dados) {
		try {
			$vl_comissao = explode("#", $dados['vl_comissao']);
			$vl_comissao = number_format($vl_comissao[1],2, '.','');
			
			$Row = $this->getRow($dados['id_cotacao']);
			$Row->id_produto = $dados['id_produto'];
			$Row->id_estado = $dados['id_estado'];
			$Row->id_municipio = $dados['id_municipio'];
			$Row->cpf_cnpj = $dados['cpf_cnpj'];
			$Row->cep = str_replace('-', '', $dados['ds_cep']);
			$Row->id_corretor = $dados['id_corretor'];
			$Row->id_preposto = $dados['id_preposto'] ? $dados['id_preposto'] : null;
			$Row->vl_premio = str_replace(',','.',str_replace('.','',$dados['calculo']['vl_premio']));
			$Row->vl_subvencao_federal = str_replace(',','.',str_replace('.','',$dados['calculo']['sub_federal']));
			$Row->vl_subvencao_estadual = str_replace(',','.',str_replace('.','',$dados['calculo']['sub_estadual']));
			$Row->vl_comissao = $vl_comissao;

			return $Row->save();
		} catch (Exception $e) {
			return $e->getMessage();
		}
	}

	public function coberturas($id_produto, $tipo=false, $all=false) {

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('c' => 'produto.coberturas'), array('ds_nome_cobertura', 
			'ds_descricao_cobertura', 'ds_chave_cobertura', 'cd_cobertura_seguradora', 'id_legacy'));
		$Select->join(array('pc' => 'produto.produtos_coberturas'), 'c.id = pc.id_cobertura', 
			array('id_cobertura','fl_cobertura_principal', 'fl_taxa_relacionada', 
				'fl_somente_renovacoes', 'fl_vistoria_previa', 'vl_lmi', 'id_condicao_especial', 
				'fl_vistoria_preliminar', 'fl_cobertura_dependente', 'id_cobertura_dependencia', 
				'fl_exibir_franquia', 'fl_vistoria_final', 'id_tipo_liquidacao', 'fl_contratacao_automatica', 
				'nr_prioridade_liquidacao', 'fl_exibir_regulacao_perdas'));
		$Select->where('pc.id_produto = ?', $id_produto);
		$Select->order(array('pc.fl_cobertura_principal desc', 'c.id'));

		if (!$all) {
			$Select->where('pc.fl_ativo = true');
		}

		if ($tipo == 'principal') {
			$Select->where('fl_cobertura_principal is true');
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		if ($tipo == 'adicional') {
			$Select->where('fl_cobertura_principal is false');
		}

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function comercializacoes($params) {

    	$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$select->from(array('c' => 'comercializacao.comercializacoes'), '*');
		$select->join(array('m' => 'comercializacao.comercializacoes_municipios'), 'c.id = m.id_comercializacao', false);
		$select->where("id_produto = ?", $params['id_produto'], 'integer');
		$select->where("id_municipio = ?", $params['id_municipio'], 'integer');
		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

		if ($Row) {
			if($Row['fl_ativo'] == false) return false;
			return $Row;
		} else {
			$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
			$select->from(array('c' => 'comercializacao.comercializacoes'), '*');
			$select->join(array('e' => 'comercializacao.comercializacoes_estados'), 'c.id = e.id_comercializacao', false);
			$select->where("id_produto = ?", $params['id_produto'], 'integer');
			$select->where("id_estado = ?", $params['id_estado'], 'integer');
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

			if ($Row) {
				if($Row['fl_ativo'] == false) return false;
				return $Row;
			}
		}		
	}

	public function grupoProponenteUsuario($params) {
		if ($params['cpf_cnpj'] && $params['id_municipio'] && $params['id_usuario']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tap' => 'comercializacao.taxas_agrupamento_proponentes'), 'a.id = tap.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', 'vl_produtividade_estimada');
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('p' => 'seguro.proponentes'), 'tap.id_proponente = p.id', false);
			$Select->where("tam.id_municipio = ?", $params['id_municipio']);
			$Select->where("p.cpf_cnpj = ?", $params['cpf_cnpj']);
			$Select->where("tau.id_usuario = ?", $params['id_usuario']);
			$Select->where("a.id_produto = ?", $params['id_produto']);
			$Select->where("a.tp_taxa_agrupamento = 'P'");
			$Select->where("a.fl_ativo = true");
	
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

	public function grupoProponente($params) {
		if ($params['cpf_cnpj'] && $params['id_municipio']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tap' => 'comercializacao.taxas_agrupamento_proponentes'), 'a.id = tap.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', 'vl_produtividade_estimada');
			$Select->join(array('p' => 'seguro.proponentes'), 'tap.id_proponente = p.id', false);
			$Select->where("tam.id_municipio = ?", $params['id_municipio']);
			$Select->where("p.cpf_cnpj = ?", $params['cpf_cnpj']);
			$Select->where("a.id_produto = ?", $params['id_produto']);
			$Select->where("a.tp_taxa_agrupamento = 'P'");
			$Select->where("a.fl_ativo = true");
			$Select->where("a.id not in (select id_taxa_agrupamento from comercializacao.taxas_agrupamento_usuarios)");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;
	}

	public function grupoPreposto($params) {
		if ($params['id_usuario'] && $params['id_municipio']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', 'vl_produtividade_estimada');
			$Select->where("tam.id_municipio = ?", $params['id_municipio']);
			$Select->where("tau.id_usuario = ?", $params['id_usuario']);
			$Select->where("a.id_produto = ?", $params['id_produto']);
			$Select->where("a.tp_taxa_agrupamento = 'U'");
			$Select->where("a.fl_ativo = true");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}
	
		return false;		
	}

	public function grupoCorretor($params) {
		if ($params['id_usuario'] && $params['id_municipio']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', 'vl_produtividade_estimada');
			$Select->where("tam.id_municipio = ?", $params['id_municipio']);
			$Select->where("tau.id_usuario = ?", $params['id_usuario']);
			$Select->where("a.id_produto = ?", $params['id_produto']);
			$Select->where("a.tp_taxa_agrupamento = 'U'");
			$Select->where("a.fl_ativo = true");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}
		
		return false;		
	}

	public function grupoMunicipio($params) {
		if ($params['id_municipio']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', 'vl_produtividade_estimada');
			$Select->where("tam.id_municipio = ?", $params['id_municipio']);
			$Select->where("a.id_produto = ?", $params['id_produto']);
			$Select->where("a.tp_taxa_agrupamento = 'M'");
			$Select->where("a.fl_ativo = true");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;		
	}

	public function grupoEstado($params) {
		if ($params['id_municipio']) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('a' => 'comercializacao.taxas_agrupamento'));
			$Select->join(array('e' => 'comercializacao.taxas_agrupamento_estados'), 'a.id = e.id_taxa_agrupamento', false);
			$Select->where("e.id_estado = ?", $params['id_estado']);
			$Select->where("a.id_produto = ?", $params['id_produto']);
			$Select->where("a.tp_taxa_agrupamento = 'E'");
			$Select->where("a.fl_ativo = true");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return false;		
	}

	public function countTaxasCobertura($id_agrupamento, $id_cobertura) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('ta' => 'comercializacao.taxas_agrupamento'), 'count(*)');
		$Select->join(array('tv' => 'comercializacao.taxas_valores'), 'ta.id = tv.id_taxa_agrupamento', false);
		$Select->where('tv.id_cobertura = ? ', $id_cobertura, 'integer');
		$Select->where('ta.id = ? ', $id_agrupamento, 'integer');

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function isTaxaGratuita($id_agrupamento, $id_cobertura) {

		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('ta' => 'comercializacao.taxas_agrupamento'),false);
		$Select->join(array('tv' => 'comercializacao.taxas_valores'), 'ta.id = tv.id_taxa_agrupamento', array('max(vl_taxa) as vl_taxa', 'max(vl_taxa_renovacao) as vl_taxa_renovacao'));
		$Select->where('ta.id = ?', $id_agrupamento);
		$Select->where('tv.id_cobertura = ?', $id_cobertura);
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

		$return = false;

		if (count($Rs)) {
	        $return = ($Rs[0]['vl_taxa'] == 0 ? true : false);
		}

		return $return;		
	}

	public function isInadimplente($cpf_cnpj) {
		$Proponentes = new Seguro_Model_Proponentes();
		$proponente = $Proponentes->getProponente($cpf_cnpj);		

		return $proponente['fl_inadimplente'];
	}

	public function getTaxasRelacionadas($id_agrupamento) {
		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('ta' => 'comercializacao.taxas_agrupamento'));
		$Select->join(array('tv' => 'comercializacao.taxas_valores'), 'ta.id = tv.id_taxa_agrupamento');

		$Select->where('ta.id = ?', $id_agrupamento, 'integer');
		$Select->where("tv.fl_franquia_disponivel in ('S', 'N')");
		$Select->order("tv.vl_franquia asc");

		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
		$return = array();

		if (count($Rs)) {
			foreach ($Rs as $Row) {
				$return[] = $Row;
			}
		}

		return $return;
	}

	public function getData($where=false) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('sc' => 'seguro.cotacoes'), array('sc.id as id_cotacao','sc.id_usuario_criacao','sc.id',"to_char(sc.dt_criacao, 'dd/mm/yyyy') as dt_criacao", 'id_produto', 'id_estado', 'id_municipio', 'cpf_cnpj', 'id_corretor', 'cep', 'id_preposto', 'id_proposta', 'vl_premio', 'vl_subvencao_estadual', 'vl_subvencao_federal'));
		$select->join(array('sp' => 'seguro.proponentes'), 'sc.cpf_cnpj = sp.cpf_cnpj', 'ds_nome_proponente');
		$select->join(array('suf' => 'sistema.estados'), 'sc.id_estado = suf.id', false);
		$select->join(array('sm' => 'sistema.municipios'), 'sc.id_municipio = sm.id', "sm.ds_nome_municipio||'/'||suf.ds_sigla as nome_municipio");
		$select->join(array('pp' => 'produto.produtos'), 'sc.id_produto = pp.id', ['ds_nome_produto', 'ds_nome_abreviado']);
		$select->join(array('ps' => 'produto.safras'), 'pp.id_safra = ps.id', 'ds_nome_safra');
		$select->joinLeft(array('scr' => 'sistema.corretores'), 'sc.id_corretor = scr.id', 'ds_nome_corretor');
		$select->joinLeft(array('spr' => 'sistema.prepostos'), 'sc.id_preposto = spr.id', 'ds_nome_preposto');

		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);
		}		

		$select->order($this->_order);
		return $select;
	}

	public function saveProponenteData($proponente, $id_proposta) {
		$Proponentes = new Seguro_Model_PropostasProponentes();
		if ($proponente['id_estado_civil'] == '') {
			$proponente['id_estado_civil'] = 0;
			$proponente['ds_endereco_rua'] = ' ';
			$proponente['ds_endereco_nro'] = ' ';
			$proponente['ds_endereco_bairro'] = ' ';
			$proponente['ds_endereco_cep'] = '_____-__';
			$proponente['id_municipio'] = 5578;
		}
		return $Proponentes->save($proponente, $id_proposta);
	}

	public function savePropriedadeData($propriedade, $id_proposta) {
		$Propriedades = new Seguro_Model_PropostasPropriedades();
		return $Propriedades->save($propriedade, $id_proposta);		
	}

	public function saveUnidadesData($unidades, $id_proposta) {
		$ItensSegurados = new Seguro_Model_ItensSegurados();
		$nro = 1;

		if (count($unidades)>0) {
			foreach ($unidades as $un) {
				$un['IS_PRODUTIVIDADE'] = $un['IS_PRODUTIVIDADE']/1000;
				$ItensSegurados->save($nro, $un, $id_proposta);
				$ItensSeguradosComplemento = new Seguro_Model_ItensSeguradosComplementos();
				$item = $ItensSegurados->fetchRow('id_proposta = ' . $id_proposta);
				try {
					$ItensSeguradosComplemento->save($un, $item->id, false);
				} catch (Exception $e) {
					return $e->getMessage();
				}
				$nro++;
			}
		}

		return true;

	}

	public function saveCoberturasData($coberturas, $id_proposta, $id_produto) {

		if (count($coberturas)>0) {
			$Coberturas = new Produto_Model_ProdutosCoberturas();

			foreach($coberturas as $cob) { 
				$Cobertura = $Coberturas->find($id_produto, $cob['id_cobertura']);
				$cob['id_proposta'] = $id_proposta;
				$cob['vl_taxa_bi'] = $cob['vl_taxa'];
				$cob['vl_lmi'] = $Cobertura->vl_lmi;
				$cob['fl_principal'] = $cob['fl_principal'] ? 1 : 0;
				Agro_Db_Table_Abstract::getDefaultAdapter()->insert('seguro.propostas_coberturas', $cob);
			}
		} else {
			return false;
		}

		return true;
	}

	public function saveParcelaData($parcela, $id_proposta) {
		$Parcelas = new Seguro_Model_PropostasParcelas();
		return $Parcelas->save($parcela, 1, $id_proposta);
	}
	
	/*
	 Recupera valores mínimos e máximos de IS.
	 Ou na config. do produto ou nas configs. das variedades
	*/
	public function getIsMinMax(int $id_produto) : array{
		$result = array();

		$select = $this->select()->setIntegrityCheck(false)
			->from(array('par' => 'produto.produtos_atributos_rn'), 'ds_valor')
			->join(array('pgar' => 'produto.produtos_grupos_atributos_rn'), 'par.id_grupo_atributo_rn = pgar.id', null)
			->join(array('arn' => 'produto.atributos_rn'), 'arn.id = par.id_atributo_rn', 'ds_chave_rn')
			->where('pgar.id_produto = ?', $id_produto)
			->where("pgar.ds_tipo = 'p'")
			->where('par.fl_ativo = true')
			->where('pgar.fl_ativo = true')
			->where('par.fl_del = false')
			->where("arn.ds_chave_rn in ('LIMITE_MINIMO_IS','LIMITE_MAXIMO_IS')");

		$rows = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);

		if ((count($rows)>0) && ($rows[0]['ds_valor'] > 0) && ($rows[1]['ds_valor'] > 0)) {
			foreach ($rows as $row) {
				$result[($row['ds_chave_rn'] == 'LIMITE_MINIMO_IS') ? 'is_min' : 'is_max'] = $row['ds_valor'];
			}
		}

		return $result;
	}
	
	public function getVariedadeMinMax(int $id_produto, int $id_grupo) : array {
		$resul = array();

		$select = $this->select()->setIntegrityCheck(false)
			->from(array('pv' => 'produto.produtos_variedades'),
				array('min(vl_importancia_segurada_minima) as is_min','max(vl_importancia_segurada_maxima) as is_max'))
			->where('pv.id_produto = ?', $id_produto)
			->where('pv.id_validacao_limites_lmga = ?', $id_grupo)
			->limit(1);

		$rows = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);
		$result['is_min'] = $rows[0]['is_min'];
		$result['is_max'] = $rows[0]['is_max'];

		return $result;
	}

	public function getSubvencaoCultura(int $id_usuario, int $id_produto)
    {
        $cultura = (new Produto_Model_Produtos())->getCultura($id_produto);
        $comercial = $this->getComercial($id_usuario);
        $idGrupoLimiteSubvencao = (new Produto_Model_ValidacoesSubvencaoGrupos())->getGrupoLimiteSubvencao(
            (int)$comercial['id_comercial'],
            (int)$cultura['id'],
            $id_usuario,
            date('Y')
        );

        if ($idGrupoLimiteSubvencao['id'] > 0) {
            $select = $this->select()->setIntegrityCheck(false);
            $select->from(
                array('vls' => 'produto.validacoes_limites_subvencao_grupos'),
                array('vl_limite_subvencao', 'seguro.soma_subvencao_utilizada(vls.id) as vl_subvencao_utilizada')
            );
            $select->where('id = ?', $idGrupoLimiteSubvencao['id']);
            $row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

            return array(
                'grupo' => $idGrupoLimiteSubvencao['id'],
                'liberado' => $row['vl_limite_subvencao'],
                'usado' => $row['vl_subvencao_utilizada']
            );
        } else {
            return array(
                'grupo' => null,
                'liberado' => 0,
                'usado' => 0
            );
        }
    }

	public function subvencaoCulturaGrupoCorretores(int $id_usuario, int $id_produto) {
		$cultura = (new Produto_Model_Produtos())->getCultura($id_produto);
		$corretor = $this->getComercial($id_usuario);

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('v' => 'seguro.v_subvencao_federal_corretor_grupo'), array('vl_liberado', 'vl_usado'));
		$Select->where('id_validacao in (select id_validacao_subvencao_grupo from produto.validacoes_limites_subvencao_grupos_usuarios where id_usuario = '.$id_usuario.')');
		$Select->where('v.id_cultura = ?', $cultura['id']);
		$Select->where('v.fl_ativo = true');

		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

		return array(
			'liberado' => $Row['vl_liberado'],
			'usado' => $Row['vl_usado']
		);
	}

	private function getComercial(int $id_usuario) {
		$Select = $this->select()->setIntegrityCheck(false)
			->from(array('u' => 'sistema.prepostos'), 'id_comercial')
			->where('id_usuario = ?', $id_usuario);
		$rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

		if(!$rs){
    		$Select = $this->select()->setIntegrityCheck(false)
    			->from(array('u' => 'sistema.corretores'), 'id_comercial')
    			->where('id_usuario = ?', $id_usuario);
    		$rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return $rs;
	}
}