<?php
class Seguro_Model_PropostasContratosResseguro extends Agro_Db_Table_Abstract {
    protected $_schema = 'seguro';
    protected $_name = 'propostas_contratos_resseguro';
    protected $_primary = 'id';

    public function save(array $values)
    {
        $row = $this->getRow($values['id']);
        $row->id_proposta = $values['id_proposta'];
        $row->id_contrato_resseguro = $values['id_contrato_resseguro'];
        $row->save();
        return $row;
    }

    /**
     * Verifica se há um contrato cadastrado para o perído que a emissão da proposta está sendo emitida/cancelada
     *
     * @param int $idProposta
     */
    public function vincularContrato(int $idProposta): void
    {
        // Valida se já existe víncula para a proposta informada
        if ($this->propostaPossuiContratoVinculado($idProposta)) {
            return;
        }
        
        //Se for um endosso, verificamos se a proposta mãe já está vinculada a um contrato
        $idContratoResseguro = $this->getVinculoContratoPropostaMae($idProposta);

        //Caso não possua contrato de resseguro vinculado, buscamos qual se encaixa no período de emissão de apólice
        if (empty($idContratoResseguro)) {
            $idContratoResseguro = (new Produto_Model_ContratosResseguro())->getIdContratoResseguroByProposta($idProposta);
        }

        if (!empty($idContratoResseguro)) {
            $save = $this->save([
                "id_proposta" => $idProposta,
                "id_contrato_resseguro" => $idContratoResseguro
            ]);

            if (!$save) {
                throw new Exception("Erro ao vincular o contrato de resseguro.");
            }
        }
    }

    /**
     * Verifica se a proposta informada já possui um contrato de resseguro vinculado
     *
     * @param int $idProposta
     * @return bool
     */
    public function propostaPossuiContratoVinculado(int $idProposta): bool
    {
        $propostaContratoResseguro = $this->getByProposta($idProposta);
        return !empty($propostaContratoResseguro);
    }

    /**
     * Retorna qual o id do contrato de resseguro que a proposta mae está vinculado
     *
     * @param int $idProposta
     * @return int|null
     */
    private function getVinculoContratoPropostaMae(int $idProposta): ?int
    {
        $idContratoResseguro = null;
        $idPropostaMae = (new Endosso_Model_Propostas())->getPropostaMae($idProposta);

        if ($idProposta != $idPropostaMae) {
            $propostaMaeContratoResseguro = $this->getByProposta($idPropostaMae);
            if (!empty($propostaMaeContratoResseguro)) {
                $idContratoResseguro = $propostaMaeContratoResseguro['id_contrato_resseguro'];
            }
        }

        return $idContratoResseguro;
    }

    /**
     * Busca o contrato de resseguro pela proposta informada
     *
     * @param int $idProposta
     * @return array
     */
    public function getByProposta(int $idProposta): array
    {
        $select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(['pcr' => "{$this->_schema}.{$this->_name}"], ['id_proposta', 'id_contrato_resseguro']);
        $select->join(['cr' => "produto.contratos_resseguro"], "cr.id = pcr.id_contrato_resseguro", ['ds_nome', 'dt_inicio_vigencia', 'dt_termino_vigencia']);
		$select->where('pcr.id_proposta = ?', $idProposta);
        $rs = $this->getDefaultAdapter()->fetchRow($select);

        return !empty($rs) ? $rs : [];
    }
}
