<?php

namespace App\Http\Controllers\api\v1;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\cfdi;

class TimbradoController extends Controller
{
    public function timbradoTest(Request $request)
    { 
        $rfc = $request->input('rfc');
        $inib64 = $request->input('inib64');
        $cer = $request->input('cer');
        $key = $request->input('key');
        $pass = $request->input('pass');
        
        // URL del servicio SOAP
        $url = "https://ini.facturacionmexico.com.mx:443/timbrarini.php";
        
        // Construir el cuerpo del mensaje SOAP
        $xmlRequest = <<<XML
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:wservicewsdl">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:timbrarini1 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <rfc xsi:type="xsd:string">$rfc</rfc>
         <inib64 xsi:type="xsd:string">$inib64</inib64>
         <cer xsi:type="xsd:string">$cer</cer>
         <key xsi:type="xsd:string">$key</key>
         <pass xsi:type="xsd:string">$pass</pass>
      </urn:timbrarini1>
   </soapenv:Body>
</soapenv:Envelope>
XML;
   
        // Configuración de la solicitud SOAP
        $soapHeaders = [
            'Content-Type: text/xml',
            'Content-Length: ' . strlen($xmlRequest)
        ];

        // Configuración del contexto de la solicitud
        $contextOptions = [
            'http' => [
                'header' => implode("\r\n", $soapHeaders),
                'method' => 'POST',
                'content' => $xmlRequest,
                'timeout' => 30
            ]
        ];

        // Crear el contexto de la solicitud
        $context = stream_context_create($contextOptions);

        try {
            $response = file_get_contents($url, false, $context);
            if ($response === false) {
                throw new \Exception("Error al realizar la solicitud SOAP");
            }
    
            // Procesar la respuesta XML
            $xmlResponse = simplexml_load_string($response);
            if ($xmlResponse === false) {
                throw new \Exception("Error al parsear la respuesta SOAP");
            }
    
            // Extraer los valores de la respuesta
            $codigoMfNumero = (int) $xmlResponse->xpath('//codigo_mf_numero')[0];
            $codigoMfTexto = (string) $xmlResponse->xpath('//codigo_mf_texto')[0];
    
            if ($codigoMfNumero === 0) {
                // No hubo error, guardar la factura en la base de datos
                $factura = new cfdi();
                $factura->cfdi = (string) $xmlResponse->xpath('//cfdi')[0];
                $factura->png = (string) $xmlResponse->xpath('//png')[0];
                $factura->idpac = (int) $xmlResponse->xpath('//idpac')[0];
                $factura->pac = (int) $xmlResponse->xpath('//pac')[0];
         //       $factura->produccion = (string) $xmlResponse->xpath('//produccion')[0];
         //       $factura->mensaje_original_pac_json = (string) $xmlResponse->xpath('//mensaje_original_pac_json')[0];
         //       $factura->cancelada = (string) $xmlResponse->xpath('//cancelada')[0];
        //        $factura->saldo = (int) $xmlResponse->xpath('//saldo')[0];
                $factura->uuid = (string) $xmlResponse->xpath('//uuid')[0];
        //        $factura->servidor = (string) $xmlResponse->xpath('//servidor')[0];
                $factura->representacion_impresa_cadena = (string) $xmlResponse->xpath('//representacion_impresa_cadena')[0];
                $factura->representacion_impresa_certificado_no = (string) $xmlResponse->xpath('//representacion_impresa_certificado_no')[0];
                $factura->representacion_impresa_fecha_timbrado = (string) $xmlResponse->xpath('//representacion_impresa_fecha_timbrado')[0];
                $factura->representacion_impresa_sello = (string) $xmlResponse->xpath('//representacion_impresa_sello')[0];
                $factura->representacion_impresa_selloSAT = (string) $xmlResponse->xpath('//representacion_impresa_selloSAT')[0];
                $factura->representacion_impresa_certificadoSAT = (string) $xmlResponse->xpath('//representacion_impresa_certificadoSAT')[0];
                $factura->save();
    
                return response()->json(['message' => 'La factura se generó correctamente'], 200);
            } else {
                // Hubo un error, devolver el mensaje de error
                return response()->json(['error' => $codigoMfTexto], 500);
            }
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }

/*
aqui era
        // Realizar la solicitud SOAP
        try {
            $response = file_get_contents($url, false, $context);
            if ($response === false) {
                throw new \Exception("Error al realizar la solicitud SOAP");
            }

            // Devolver la respuesta como XML
            return response($response, 200)->header('Content-Type', 'text/xml');
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }*/
    }
}
