<?php

namespace App\Services\ElectronicBilling\Builders;

use DOMDocument;
use DOMElement;

class MensajeReceptorBuilder
{
    private DOMDocument $doc;
    private DOMElement $root;

    public function build(array $data): string
    {
        $ns = 'https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.4/mensajeReceptor';

        $this->doc = new DOMDocument('1.0', 'utf-8');
        $this->doc->preserveWhiteSpace = false;
        $this->doc->formatOutput = true;

        $this->root = $this->doc->createElementNS($ns, 'MensajeReceptor');
        $this->root->setAttribute('xmlns', $ns);
        $this->root->setAttribute('xmlns:xsd', $ns . '.xsd');
        $this->root->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');

        $this->doc->appendChild($this->root);

        $this->addText('Clave', $data['clave']);
        $this->addText('NumeroCedulaEmisor', $data['numero_cedula_emisor']);
        $this->addText('FechaEmisionDoc', $data['fecha_emision_doc']);
        $this->addText('Mensaje', $data['mensaje']);

        if (!empty($data['detalle_mensaje'])) {
            $this->addText('DetalleMensaje', $data['detalle_mensaje']);
        }

        if ($data['monto_total_impuesto'] !== null) {
            $this->addText('MontoTotalImpuesto', $this->formatDecimal($data['monto_total_impuesto']));
        }

        if (($data['mensaje'] ?? '') !== '3') {
            if (!empty($data['codigo_actividad']) && ($data['condicion_impuesto'] ?? null) !== '05') {
                $this->addText('CodigoActividad', $data['codigo_actividad']);
            }

            if (!empty($data['condicion_impuesto'])) {
                $this->addText('CondicionImpuesto', $data['condicion_impuesto']);
            }

            if (($data['condicion_impuesto'] ?? null) !== '05' && $data['monto_total_impuesto_acreditar'] !== null) {
                $this->addText('MontoTotalImpuestoAcreditar', $this->formatDecimal($data['monto_total_impuesto_acreditar']));
            }

            if (($data['condicion_impuesto'] ?? null) !== '05' && $data['monto_total_de_gasto_aplicable'] !== null) {
                $this->addText('MontoTotalDeGastoAplicable', $this->formatDecimal($data['monto_total_de_gasto_aplicable']));
            }
        }

        $this->addText('TotalFactura', $this->formatDecimal($data['total_factura']));
        $this->addText('NumeroCedulaReceptor', $data['numero_cedula_receptor']);
        $this->addText('NumeroConsecutivoReceptor', $data['numero_consecutivo_receptor']);

        return $this->doc->saveXML();
    }

    private function addText(string $name, ?string $value): void
    {
        if ($value === null || $value === '') {
            return;
        }

        $node = $this->doc->createElement($name);
        $node->appendChild($this->doc->createTextNode($value));
        $this->root->appendChild($node);
    }

    private function formatDecimal($value): string
    {
        return number_format((float) $value, 5, '.', '');
    }
}