package request

import "encoding/xml"

// SOAPRequestEnvelope define la estructura general del mensaje SOAP.
type SOAPRequestEnvelope struct {
	XMLName      xml.Name           `xml:"soapenv:Envelope"`
	XmlnsSoapenv string             `xml:"xmlns:soapenv,attr"` // URL del namespace SOAP
	XmlnsSiat    string             `xml:"xmlns:siat,attr"`    // URL del namespace siat
	Header       *SOAPRequestHeader `xml:"soapenv:Header,omitempty"`
	//Body         SOAPRequestBody    `xml:"soapenv:Body"`
	Body SOAPRequestBody `xml:"soapenv:Body"`
}

type SOAPRequestHeader struct{}

type SOAPRequestBody struct {
	Operacion OperacionXML `xml:",any"`
}

type OperacionXML struct {
	XMLName   xml.Name
	Solicitud SolicitudSincronizacion `xml:"SolicitudSincronizacion"`
}

// MarshalXML permite controlar la serialización de OperacionXML para usar el nombre de etiqueta deseado.
func (o OperacionXML) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	start.Name = o.XMLName
	// Encapsulamos la solicitud en una estructura anónima para que se serialice correctamente.
	return e.EncodeElement(struct {
		Solicitud SolicitudSincronizacion `xml:"SolicitudSincronizacion"`
	}{o.Solicitud}, start)
}

// SolicitudSincronizacion representa la información de la sincronización que se debe enviar.
type SolicitudSincronizacion struct {
	CodigoAmbiente   string `xml:"codigoAmbiente,omitempty"`
	CodigoPuntoVenta string `xml:"codigoPuntoVenta,omitempty"`
	CodigoSistema    string `xml:"codigoSistema,omitempty"`
	CodigoSucursal   string `xml:"codigoSucursal,omitempty"`
	Cuis             string `xml:"cuis,omitempty"`
	Nit              string `xml:"nit,omitempty"`
}
