<?php

class Log_Service_XmlTransmissaoProposta
{
    private const XML_XPATH_BASE = "/soap:Envelope/soap:Body/ns:EnviarPropostaSeguroAgricola/ns:propostaSeguroAgricola";
    private SimpleXMLElement $xmlSimpleObject;

    /**
     * @throws Zend_Exception
     */
    public function __construct(int $idProposta, bool $isEndosso = false)
    {
        $this->getXml($idProposta, $isEndosso);
    }

    /**
     * @throws Zend_Exception
     */
    private function getXml(int $idProposta, bool $isEndosso): void
    {
        $tipoTransmissao = !$isEndosso ? 'EMITIR_PROPOSTA' : 'EMITIR_PROPOSTA (Endosso)';
        $retorno = (new Log_Model_PropostasTransmissao())
            ->fetchAll(
                "id_proposta = {$idProposta} AND ds_tipo_transmissao = '{$tipoTransmissao}' AND fl_sucesso is true",
                "id desc"
            )
            ->current();

        if (empty($retorno)) {
            throw new Zend_Exception('XML não encontrado.', 1);
        }

        $this->xmlSimpleObject = simplexml_load_string($retorno['ds_xml_transmissao']);

        // Registrar namespaces que aparecem no documento
        $this->xmlSimpleObject->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
        // Namespace default do método (precisamos dar um prefixo qualquer, ex: ns)
        $this->xmlSimpleObject->registerXPathNamespace('ns', 'http://www.essor.com.br/');
    }

    public function getProdutividadeGarantidaItem($codigoItem): ?string
    {
        $nodes = $this->xmlSimpleObject->xpath(
            self::XML_XPATH_BASE . "/ns:locais/ns:local/ns:itens/ns:item[ns:codigo='{$codigoItem}']"
        );

        if (!empty($nodes)) {
            return trim((string)$nodes[0]->produtividadeGarantida);
        }

        return null;
    }

    public function getFranquia($codigoItem, $codigoCoberturaSeguradora): ?string
    {
        $caminho = "/ns:locais/ns:local/ns:itens/ns:item[ns:codigo='{$codigoItem}']/ns:coberturas";
        $caminho .= "/ns:cobertura[ns:codigo='{$codigoCoberturaSeguradora}']/ns:verbas/ns:verba/ns:franquia/ns:valor";

        $nodes = $this->xmlSimpleObject->xpath(
            self::XML_XPATH_BASE . $caminho
        );

        if (!empty($nodes)) {
            return trim((string)$nodes[0]);
        }

        return null;
    }

    public function getImportanciaSegurada($codigoItem, $codigoCoberturaSeguradora): ?string
    {
        $caminho = "/ns:locais/ns:local/ns:itens/ns:item[ns:codigo='{$codigoItem}']/ns:coberturas";
        $caminho .= "/ns:cobertura[ns:codigo='{$codigoCoberturaSeguradora}']/ns:verbas/ns:verba/ns:importanciaSegurada";
        $caminho .= "/ns:valor";

        $nodes = $this->xmlSimpleObject->xpath(
            self::XML_XPATH_BASE . $caminho
        );

        if (!empty($nodes)) {
            return trim((string)$nodes[0]);
        }

        return null;
    }

    public function getValorPremioLiquido($codigoItem, $codigoCoberturaSeguradora): ?string
    {
        $caminho = "/ns:locais/ns:local/ns:itens/ns:item[ns:codigo='{$codigoItem}']/ns:coberturas";
        $caminho .= "/ns:cobertura[ns:codigo='{$codigoCoberturaSeguradora}']/ns:verbas/ns:verba/ns:premio";
        $caminho .= "/ns:valorLiquido";

        $nodes = $this->xmlSimpleObject->xpath(
            self::XML_XPATH_BASE . $caminho
        );

        if (!empty($nodes)) {
            return trim((string)$nodes[0]);
        }

        return null;
    }

    public function getPercentualParticipacaoBeneficiario(string $cpfCnpj): ?string
    {
        $cpfCnpj = Agro_Util::retornarSomenteNumeros($cpfCnpj);
        $propriedade = strlen($cpfCnpj) === 11 ? 'cpf' : 'cnpj';
        $caminho = "/ns:beneficiarios/ns:beneficiario[ns:detalhe/ns:{$propriedade}='{$cpfCnpj}']";
        $caminho .= "/ns:percentualParticipacao";

        $nodes = $this->xmlSimpleObject->xpath(
            self::XML_XPATH_BASE . $caminho
        );

        if (!empty($nodes)) {
            return trim((string)$nodes[0]);
        }

        return null;
    }
}