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"`
}

type SOAPRequestHeader struct{}

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

// /////////////////////////////// CUIS //////////////////////////////////////
type OperacionXML struct {
	XMLName   xml.Name
	Solicitud SolicitudCuisCufd `xml:"SolicitudCuis"`
}

// 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 SolicitudCuisCufd `xml:"SolicitudCuis"`
	}{o.Solicitud}, start)
}

// /////////////////////////////// CUIS //////////////////////////////////////

type SolicitudCuisCufd struct {
	CodigoAmbiente            string `xml:"codigoAmbiente,omitempty" json:"codigoAmbiente"`
	CodigoModalidad           string `xml:"codigoModalidad,omitempty" json:"codigoModalidad"`
	CodigoPuntoVenta          string `xml:"codigoPuntoVenta,omitempty" json:"codigoPuntoVenta"`
	CodigoSistema             string `xml:"codigoSistema,omitempty" json:"codigoSistema"`
	CodigoSucursal            string `xml:"codigoSucursal,omitempty" json:"codigoSucursal"`
	Nit                       string `xml:"nit,omitempty"           json:"nit"`
	Cuis                      string `xml:"cuis,omitempty"           json:"cuis,omitempty"`
	KeyToken                  string `xml:"keyToken,omitempty"       json:"keyToken,omitempty"`
	ValueToken                string `xml:"valueToken,omitempty"     json:"valueToken,omitempty"`
	NombreArchivoCertificado  string `xml:"nombreArchivoCertificado,omitempty" json:"nombreArchivoCertificado,omitempty"`
	NombreArchivoClavePrivada string `xml:"nombreArchivoClavePrivada,omitempty" json:"nombreArchivoClavePrivada,omitempty"`
}
