package procesar

import (
	"daemonService/internal/models/obtencionCodigos"
	oc "daemonService/internal/models/obtencionCodigos/request"
	"encoding/xml"
	"fmt"
)

func codigoGenerarSOAPRequest(s obtencionCodigos.CuisServiceModel, solicitud oc.SolicitudCuisCufd) (string, error) {

	var xmlBytes []byte
	var err error
	var envelope oc.SOAPRequestEnvelope
	var envelopeCufd oc.SOAPRequestEnvelopeCufd
	switch solicitud.Cuis {
	case "":
		envelope = oc.SOAPRequestEnvelope{
			XmlnsSoapenv: "http://schemas.xmlsoap.org/soap/envelope/",
			XmlnsSiat:    "https://siat.impuestos.gob.bo/",
			Header:       &oc.SOAPRequestHeader{},
			Body: oc.SOAPRequestBody{
				Operacion: oc.OperacionXML{
					XMLName: xml.Name{Local: "siat:" + s.TagNames},
					Solicitud: oc.SolicitudCuisCufd{
						CodigoAmbiente:   solicitud.CodigoAmbiente,
						CodigoModalidad:  solicitud.CodigoModalidad,
						CodigoPuntoVenta: solicitud.CodigoPuntoVenta,
						CodigoSistema:    solicitud.CodigoSistema,
						CodigoSucursal:   solicitud.CodigoSucursal,
						Nit:              solicitud.Nit,
					},
				},
			},
		}
		// Se genera el XML con indentación para mayor legibilidad
		xmlBytes, err = xml.MarshalIndent(envelope, "", "   ")
		if err != nil {
			return "", fmt.Errorf("error al generar XML: %w", err)
		}
		break
	default:
		envelopeCufd = oc.SOAPRequestEnvelopeCufd{
			XmlnsSoapenv: "http://schemas.xmlsoap.org/soap/envelope/",
			XmlnsSiat:    "https://siat.impuestos.gob.bo/",
			Header:       &oc.SOAPRequestHeaderCufd{},
			Body: oc.SOAPRequestBodyCufd{
				Operacion: oc.OperacionXMLCufd{
					XMLName: xml.Name{Local: "siat:" + s.TagNamesCufd},
					Solicitud: oc.SolicitudCuisCufd{
						CodigoAmbiente:   solicitud.CodigoAmbiente,
						CodigoModalidad:  solicitud.CodigoModalidad,
						CodigoPuntoVenta: solicitud.CodigoPuntoVenta,
						CodigoSistema:    solicitud.CodigoSistema,
						CodigoSucursal:   solicitud.CodigoSucursal,
						Cuis:             solicitud.Cuis,
						Nit:              solicitud.Nit,
					},
				},
			},
		}
		// Se genera el XML con indentación para mayor legibilidad
		xmlBytes, err = xml.MarshalIndent(envelopeCufd, "", "   ")
		if err != nil {
			return "", fmt.Errorf("error al generar XML: %w", err)
		}
		break
	}

	// Se concatena la cabecera XML
	soapRequest := xml.Header + string(xmlBytes)

	return soapRequest, nil
}

//func codigoGenerarSOAPRequest(s obtencionCodigos.CuisServiceModel, solicitud oc.SolicitudCuisCufd) (string, error) {
//
//	envelope := oc.SOAPRequestEnvelope{
//		XmlnsSoapenv: "http://schemas.xmlsoap.org/soap/envelope/",
//		XmlnsSiat:    "https://siat.impuestos.gob.bo/",
//		Header:       &oc.SOAPRequestHeader{},
//		Body: oc.SOAPRequestBody{
//			Operacion: oc.OperacionXML{
//				XMLName: xml.Name{Local: "siat:" + s.TagNames},
//				Solicitud: oc.SolicitudCuisCufd{
//					CodigoAmbiente:   solicitud.CodigoAmbiente,
//					CodigoModalidad:  solicitud.CodigoModalidad,
//					CodigoPuntoVenta: solicitud.CodigoPuntoVenta,
//					CodigoSistema:    solicitud.CodigoSistema,
//					CodigoSucursal:   solicitud.CodigoSucursal,
//					Nit:              solicitud.Nit,
//				},
//			},
//		},
//	}
//
//	// Se genera el XML con indentación para mayor legibilidad
//	xmlBytes, err := xml.MarshalIndent(envelope, "", "   ")
//	if err != nil {
//		return "", fmt.Errorf("error al generar XML: %w", err)
//	}
//
//	// Se concatena la cabecera XML
//	soapRequest := xml.Header + string(xmlBytes)
//
//	return soapRequest, nil
//}
