package soap

import (
	"daemonService/internal/models/sincronizacionDatos/response"
	"encoding/xml"
	"fmt"
)

// Función genérica para parsear respuesta sincronizacion datos
func ParsearRespuestaSOAP[T any, E response.SoapResponse[T]](body []byte) (T, error) {
	var envelope E
	var emptyResult T

	if err := xml.Unmarshal(body, &envelope); err != nil {
		return emptyResult, fmt.Errorf("error deserializando XML: %v", err)
	}

	if !envelope.IsTransactionSuccessful() {
		return emptyResult, fmt.Errorf("transacción fallida en respuesta ParsearRespuestaSOAP")
	}

	return envelope.GetData(), nil
}

// Función para generar identificadores dinamicos
func ParsearRespuestaSOAPIdentificador[T any, E response.SoapResponseLeyenda[T]](body []byte) (T, error) {
	var envelope E
	var emptyResult T

	if err := xml.Unmarshal(body, &envelope); err != nil {
		return emptyResult, fmt.Errorf("error deserializando XML: %v", err)
	}

	if !envelope.IsTransactionSuccessful() {
		return emptyResult, fmt.Errorf("transacción fallida en respuesta ParsearRespuestaSOAPLeyendas")
	}

	// Asignar los códigos secuenciales
	envelope.AsignarCodigosSecuenciales()

	return envelope.GetData(), nil
}

// Función fecha hora
func ParsearRespuestaSOAPfechaHora[T any, E response.SoapResponseFechaHora[T]](body []byte) (T, error) {
	var envelope E
	var emptyResult T

	if err := xml.Unmarshal(body, &envelope); err != nil {
		return emptyResult, fmt.Errorf("error deserializando XML: %v", err)
	}

	return envelope.GetData(), nil
}
