<?php

class GeneradorXMLEcuador21 {
    public function crearXMLNotaCredito(string $ruta, array $emisor, array $cliente, array $infoNC, array $detalles): void {
        $doc = new DOMDocument('1.0', 'UTF-8');
        $doc->formatOutput = true;
        $doc->preserveWhiteSpace = false;

        // <notaCredito>
        $nota = $doc->createElement('notaCredito');
        $nota->setAttribute('id', 'comprobante');
        $nota->setAttribute('version', '1.1.0'); // ✅ CAMBIADO de 2.1.0 a 1.1.0
        $doc->appendChild($nota);

        // <infoTributaria>
        $infoTributaria = $nota->appendChild($doc->createElement('infoTributaria'));
        foreach ([
            'ambiente', 'tipoEmision', 'razonSocial', 'nombreComercial',
            'ruc', 'claveAcceso', 'codDoc', 'estab', 'ptoEmi',
            'secuencial', 'dirMatriz'
        ] as $campo) {
            $infoTributaria->appendChild($doc->createElement($campo, $emisor[$campo]));
        }

        // <infoNotaCredito>
        $info = $nota->appendChild($doc->createElement('infoNotaCredito'));
        foreach ([
            'fechaEmision', 'dirEstablecimiento',
            'tipoIdentificacionComprador', 'razonSocialComprador',
            'identificacionComprador', 'codDocModificado',
            'numDocModificado', 'fechaEmisionDocSustento',
            'totalSinImpuestos', 'valorModificacion',
            'moneda'
        ] as $campo) {
            $info->appendChild($doc->createElement($campo, $infoNC[$campo]));
        }

        // <totalConImpuestos>
        $totalConImpuestos = $info->appendChild($doc->createElement('totalConImpuestos'));
        foreach ($infoNC['totalConImpuestos'] as $imp) {
            $totalImpuesto = $totalConImpuestos->appendChild($doc->createElement('totalImpuesto'));
            $totalImpuesto->appendChild($doc->createElement('codigo', $imp['codigo']));
            $totalImpuesto->appendChild($doc->createElement('codigoPorcentaje', $imp['codigoPorcentaje']));
            $totalImpuesto->appendChild($doc->createElement('baseImponible', number_format($imp['baseImponible'], 2, '.', '')));
            $totalImpuesto->appendChild($doc->createElement('valor', number_format($imp['valor'], 2, '.', '')));
        }

        // <motivo> debe ir al final del <infoNotaCredito>
        $info->appendChild($doc->createElement('motivo', $infoNC['motivo']));

        // <detalles>
        $detallesNode = $nota->appendChild($doc->createElement('detalles'));
        foreach ($detalles as $item) {
            $detalle = $detallesNode->appendChild($doc->createElement('detalle'));
            $detalle->appendChild($doc->createElement('codigoInterno', $item['codigoInterno']));
            $detalle->appendChild($doc->createElement('descripcion', $item['descripcion']));
            $detalle->appendChild($doc->createElement('cantidad', number_format($item['cantidad'], 6, '.', '')));
            $detalle->appendChild($doc->createElement('precioUnitario', number_format($item['precioUnitario'], 6, '.', '')));
            $detalle->appendChild($doc->createElement('descuento', number_format($item['descuento'], 2, '.', '')));
            $detalle->appendChild($doc->createElement('precioTotalSinImpuesto', number_format($item['precioTotalSinImpuesto'], 2, '.', '')));

            $impuestos = $detalle->appendChild($doc->createElement('impuestos'));
            $impuesto = $impuestos->appendChild($doc->createElement('impuesto'));
            $impuesto->appendChild($doc->createElement('codigo', $item['codigo']));
            $impuesto->appendChild($doc->createElement('codigoPorcentaje', $item['codigoPorcentaje']));
            $impuesto->appendChild($doc->createElement('tarifa', $item['tarifa']));
            $impuesto->appendChild($doc->createElement('baseImponible', number_format($item['baseImponible'], 2, '.', '')));
            $impuesto->appendChild($doc->createElement('valor', number_format($item['valor'], 2, '.', '')));
        }

        // <infoAdicional>
        $infoAdicional = $nota->appendChild($doc->createElement('infoAdicional'));
        if (!empty($cliente['direccion'])) {
            $campo = $doc->createElement('campoAdicional', htmlspecialchars($cliente['direccion']));
            $campo->setAttribute('nombre', 'Dirección');
            $infoAdicional->appendChild($campo);
        }

        if (!empty($cliente['email'])) {
            $campo = $doc->createElement('campoAdicional', htmlspecialchars($cliente['email']));
            $campo->setAttribute('nombre', 'Email');
            $infoAdicional->appendChild($campo);
        }

        // Guardar archivo XML
        $doc->save($ruta);
    }
}