<?php

class Comercializacao_Model_TaxasAgrupamentoOrcamentos extends Agro_Db_Table_Abstract
{
    protected $_schema = 'comercializacao';
    protected $_name = 'taxas_agrupamento_orcamentos';
    protected $_primary = array('id_taxa_agrupamento', 'id_proposta');

    public function save($dados)
    {
        /**
         * Valida se a proposta está vinculada a outra taxa
         */
        $row = $this->getTaxaAgrupamento($dados['id_taxa_agrupamento'], '<>', $dados['id_proposta']);

        if ($row) {
            throw new Exception('Orçamento já vinculado a outra taxa.');
        }

        /**
         * Valida se existe taxa_agrupamento_orcamentos para o id_taxa_agrupamento
         */
        $row = $this->getTaxaAgrupamento($dados['id_taxa_agrupamento']);

        if (!$row) {
            $row = $this->createRow();
        }

        $modelPropostas = new Seguro_Model_Propostas();
        $rowPropostas = $modelPropostas->get($dados['id_proposta']);

        if (!$rowPropostas) {
            throw new Exception('Orçamento inválido.');
        }

        $modelPropostas->save($dados);

        $row->id_taxa_agrupamento = $dados['id_taxa_agrupamento'];
        $row->id_proposta = $dados['id_proposta'];

        return $row->save();
    }

    public function getData($where = null)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false);

        $select->from(array('c' => 'comercializacao.v_taxas_agrupamento'), '*');

        if (is_array($where)) {
            foreach ($where as $clause) {
                $parametroWhere2 = null;

                switch ($clause['field']) {
                    case 'id_proposta':
                        $parametroWhere1 = "exists(select 1 ";
                        $parametroWhere1 .= "        from comercializacao.taxas_agrupamento_orcamentos tao ";
                        $parametroWhere1 .= "       where tao.id_taxa_agrupamento = c.id ";
                        $parametroWhere1 .= "         and tao.id_proposta = {$clause['value']})";

                        break;
                    case 'ds_nome':
                        $parametroWhere1 = "exists(select 1 ";
                        $parametroWhere1 .= "        from comercializacao.taxas_agrupamento_usuarios tau ";
                        $parametroWhere1 .= "             inner join sistema.usuarios usu on usu.id = tau.id_usuario ";
                        $parametroWhere1 .= "             left join sistema.corretores cor on cor.id_usuario = usu.id ";
                        $parametroWhere1 .= "             left join sistema.prepostos pre on pre.id_usuario = usu.id ";
                        $parametroWhere1 .= "       where tau.id_taxa_agrupamento = c.id ";
                        $parametroWhere1 .= "         and (cor.ds_nome_corretor ilike '%{$clause['value']}%'";
                        $parametroWhere1 .= "              or pre.ds_nome_preposto ilike '%{$clause['value']}%'))";

                        break;
                    case 'cpf_cnpj':
                        $parametroWhere1 = "exists(select 1 ";
                        $parametroWhere1 .= "        from comercializacao.taxas_agrupamento_proponentes tap ";
                        $parametroWhere1 .= "             inner join seguro.proponentes prop on prop.id = tap.id_proponente ";
                        $parametroWhere1 .= "       where tap.id_taxa_agrupamento = c.id ";
                        $parametroWhere1 .= "         and prop.cpf_cnpj = '{$clause['value']}')";

                        break;
                    case 'id_estado':
                        $parametroWhere1 = "exists(select 1 ";
                        $parametroWhere1 .= "        from comercializacao.taxas_agrupamento_municipios tam ";
                        $parametroWhere1 .= "             inner join sistema.municipios mun on mun.id = tam.id_municipio ";
                        $parametroWhere1 .= "       where tam.id_taxa_agrupamento = c.id ";
                        $parametroWhere1 .= "         and id_estado = {$clause['value']})";

                        break;
                    case 'id_municipio':
                        $parametroWhere1 = "exists(select 1 ";
                        $parametroWhere1 .= "        from comercializacao.taxas_agrupamento_municipios tam ";
                        $parametroWhere1 .= "       where tam.id_taxa_agrupamento = c.id ";
                        $parametroWhere1 .= "         and id_municipio = {$clause['value']})";

                        break;
                    default:
                        $parametroWhere1 = "{$clause['field']} {$clause['operator']} ? ";
                        $parametroWhere2 = $clause['value'];
                        break;
                }

                $select->where($parametroWhere1, $parametroWhere2);
            }
        } elseif ($where != '') {
            $select->where($where);
        }

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

        return $select;
    }

    public function getIdPropostaByIdTaxaAgrupamento(int $idTaxaAgrupamento)
    {
        return $this->_db->fetchOne(
            $this->select()
                ->from(['taxa' => 'comercializacao.taxas_agrupamento_orcamentos'], 'id_proposta')
                ->where('id_taxa_agrupamento = ?', $idTaxaAgrupamento)
        );
    }

    public function getTaxaAgrupamento(int $idTaxaAgrupamento, string $operadorTaxaAgrupamento = '=', int $idProposta = null)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('tao' => 'comercializacao.taxas_agrupamento_orcamentos'), '*');
        $select->join(array('ta' => 'comercializacao.taxas_agrupamento'), 'tao.id_taxa_agrupamento = ta.id', '*');
        $select->where("id_taxa_agrupamento {$operadorTaxaAgrupamento} ?", $idTaxaAgrupamento);

        if (!empty($idProposta)) {
            $select->where("id_proposta = ?", $idProposta);
        }

        return $this->fetchRow($select);
    }

    public function getTaxaAgrupamentoByProposta(int $idProposta)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('tao' => 'comercializacao.taxas_agrupamento_orcamentos'), '*');
        $select->join(array('ta' => 'comercializacao.taxas_agrupamento'), 'tao.id_taxa_agrupamento = ta.id', '*');
        $select->where("id_proposta = ?", $idProposta);

        return $this->fetchRow($select);
    }
}
