<?php
require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");

class Seguro_Model_PropostasParcelas extends Agro_Db_Table_Abstract {
	protected $_log = true;
	protected $_schema = 'seguro';
	protected $_name = 'propostas_parcelas';
	protected $_primary = array('id_proposta', 'nr_parcela');

	public function save($parcela, $nro, $proposta) {
		$soma = array(
			Agro_Util::formatCurrencyDb($parcela['segurado']),
			Agro_Util::formatCurrencyDb($parcela['federal']),
			Agro_Util::formatCurrencyDb($parcela['estadual'])
		);

		$Row = $this->createRow();
		$Row->id_proposta = $proposta;
		$Row->id_endosso = $parcela['id_endosso'];
		$Row->nr_parcela = $nro;
		$Row->vl_total = array_sum($soma);
		$Row->vl_segurado = Agro_Util::formatCurrencyDb($parcela['segurado']);
		$Row->vl_subvencao_federal = Agro_Util::formatCurrencyDb($parcela['federal']);
		$Row->vl_subvencao_estadual = Agro_Util::formatCurrencyDb($parcela['estadual']);
		$Row->dt_vencimento = Agro_Util::formatDate($parcela['vencimento'], Zend_Date::W3C);

		return $Row->save();
	}

	public function getPropostasParcelasCadastradas(array $propostasParcelas): array
	{
		$str = '';
		foreach ($propostasParcelas as $idx => $arr) {
			$virgula = !$idx ? '' : ',';
			$str .= "{$virgula}({$arr['id_proposta']}, {$arr['nr_parcela']})";
		}

		$sql = "
			SELECT
				id_proposta, nr_parcela
			FROM
				(VALUES
					{$str}
				) AS t(id_proposta, nr_parcela)
			WHERE (id_proposta, nr_parcela) IN (
				SELECT id_proposta, nr_parcela
				FROM seguro.propostas_parcelas
			);
		";
		
		return $this->_db->fetchAll($sql);
	}

	public function deleteProposta($id_proposta, $id_endosso=false) {
		if ($id_proposta && $id_endosso) {
			$this->_db->query("delete from seguro.propostas_parcelas where id_endosso=$id_endosso and id_proposta=$id_proposta");
		} elseif ($id_proposta && !$id_endosso) {
			$this->_db->query("delete from seguro.propostas_parcelas where id_proposta=$id_proposta");
		}
	}

	/**
	 * Atualiza as informações dos boletos
	 *
	 * @param int $idProposta
	 * @param string $dsIdentificadorSeguradora
	 * @param int $idVersao
	 * @param int|null $nrParcela
	 * @return array
	 */
	public function consultaParcelasEssor(int $idProposta, string $dsIdentificadorSeguradora, int $idVersao, int $nrParcela = null): array
	{
		$ret = ["status" => true, "message" => "Consulta realizada com sucesso."];
		
		try {
			if (APPLICATION_ENV != 'production') {
				$client = new nusoap_client(WSDL_DEV, true, false, false, false, false, 3600, 3600);
			} else {
				$client = new nusoap_client(WSDL_PROD, true, false, false, false, false, 3600, 3600);
			}
	
			$parametroNumeroParcela = '';
			if (!empty($nrParcela)) {
				$parametroNumeroParcela = " nr_parcela = '{$nrParcela}'";
			}
	
			$xml = "<i4proerp><consulta_parcela id_endosso='{$dsIdentificadorSeguradora}' {$parametroNumeroParcela}></consulta_parcela></i4proerp>";
			$mysoapmsg = $client->serializeEnvelope($xml);
			$params = array('Servico' => 'ConsultarParcela', 'conteudoXML' => $mysoapmsg);
			$result = $client->call('Executar', array($params));
			$result_xml = simplexml_load_string(utf8_encode($result['ExecutarResult']), 'SimpleXMLElement', LIBXML_NOCDATA);
			
			$modelBoleto = new Default_Model_Boleto();
			foreach($result_xml->proposta->parcela as $parcela) {
	
				$valor_pago = str_replace('.', '', $parcela->Valor_recebido);
				$data_pagamento = (string) $parcela->Data_pagamento;
				$valor_pago = str_replace(',', '.', $valor_pago);
	
				$modelBoleto->atualizaPagamentoBoleto(array(
						'id_proposta' => $idProposta,
						'nu_boleto' => $parcela->Titulo,
						'nr_parcela' => $parcela->nr_parcela,
						'id_versao' => $idVersao,
						'vl_pago' => $valor_pago,
						'fl_pago' => $parcela->Pago,
						'dt_pagamento' => ($data_pagamento ? $data_pagamento : null)
				));
			}

		} catch (\Throwable $th) {
			$ret['status'] = false;
			$ret['message'] = $th->getMessage();
		}

		return $ret;
	}

	/**
	 * Consulta todas as parcelas de uma proposta e seus endossos (caso informado) na Essor
	 *
	 * @param Seguro_Model_Row_Proposta $proposta
	 * @param bool $flTodosEndossos
	 */
	public function consultarTodasParcelasEssor(Seguro_Model_Row_Proposta $proposta, bool $flTodosEndossos = false)
	{
		$parcelas = $proposta->parcelas(null, $flTodosEndossos);
		foreach ($parcelas as $parcela) {
			if ($parcela['fl_pago'] || empty($parcela['ds_identificador_seguradora'])) {
				continue;
			}

			$ret = $this->consultaParcelasEssor(
				$parcela['id_proposta'],
				$parcela['ds_identificador_seguradora'],
				(int) $parcela['id_versao'],
				(int) $parcela['nr_parcela']
			);
			
			if (!$ret['status']) {
				throw new Exception("Erro ao atualizar os dados da parcela {$parcela['nr_parcela']}.", 99);
			}
		}
	}

	/**
	 * Retorna a última parcela da proposta informada
	 * @param int $idProposta
	 * @return array
	 */
	public function getUltimaParcelaByProposta(int $idProposta): array
	{
		$select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['pp' => "{$this->_schema}.{$this->_name}"], '*')
			->where('pp.id_proposta = ?', $idProposta)
			->order('nr_parcela DESC');

		$rs = $this->fetchRow($select);
		return !empty($rs) ? $rs->toArray() : [];
	}
}
