package soap

import (
	"encoding/xml"
)

// SOAP Types for Factura
type RecepcionFacturaResponse struct {
	XMLName                      xml.Name                     `xml:"recepcionFacturaResponse"`
	RespuestaServicioFacturacion RespuestaServicioFacturacion `xml:"RespuestaServicioFacturacion"`
}

type RespuestaServicioFacturacion struct {
	XMLName           xml.Name  `xml:"RespuestaServicioFacturacion,omitempty"`
	CodigoDescripcion string    `xml:"codigoDescripcion,omitempty"`
	CodigoEstado      string    `xml:"codigoEstado,omitempty"`
	CodigoRecepcion   string    `xml:"codigoRecepcion,omitempty"`
	MensajesList      []Mensaje `xml:"mensajesList,omitempty" json:"mensajes_list,omitempty"`
	Transaccion       bool      `xml:"transaccion,omitempty"`
}

type Mensaje struct {
	Codigo        string `xml:"codigo,omitempty" json:"codigo,omitempty"`
	Descripcion   string `xml:"descripcion,omitempty" json:"descripcion,omitempty"`
	Advertencia   string `xml:"advertencia,omitempty" json:"advertencia,omitempty"`
	NumeroArchivo string `xml:"numeroArchivo,omitempty" json:"numeroArchivo,omitempty"`
	NumeroDetalle string `xml:"numeroDetalle,omitempty" json:"numeroDetalle,omitempty"`
}

type SolicitudServicioRecepcionFactura struct {
	CodigoAmbiente        int    `xml:"codigoAmbiente"`
	CodigoDocumentoSector int    `xml:"codigoDocumentoSector"`
	CodigoEmision         int    `xml:"codigoEmision"`
	CodigoModalidad       int    `xml:"codigoModalidad"`
	CodigoPuntoVenta      int    `xml:"codigoPuntoVenta"`
	CodigoSistema         string `xml:"codigoSistema"`
	CodigoSucursal        int    `xml:"codigoSucursal"`
	CUFD                  string `xml:"cufd"`
	CUIS                  string `xml:"cuis"`
	NIT                   string `xml:"nit"`
	TipoFacturaDocumento  int    `xml:"tipoFacturaDocumento"`
	Archivo               string `xml:"archivo"`
	FechaEnvio            string `xml:"fechaEnvio"`
	HashArchivo           string `xml:"hashArchivo"`
}

type RecepcionFacturaEnvelope struct {
	XMLName xml.Name `xml:"soapenv:Envelope"`
	SoapEnv string   `xml:"xmlns:soapenv,attr"`
	Siat    string   `xml:"xmlns:siat,attr"`
	Header  struct{} `xml:"soapenv:Header"`
	Body    struct {
		Recepcion struct {
			Solicitud SolicitudServicioRecepcionFactura `xml:"SolicitudServicioRecepcionFactura"`
		} `xml:"siat:recepcionFactura"`
	} `xml:"soapenv:Body"`
}

// SOAP Types for Estado Factura
type VerificacionEstadoFacturaResponse struct {
	XMLName                      xml.Name                     `xml:"verificacionEstadoFacturaResponse"`
	RespuestaServicioFacturacion RespuestaServicioFacturacion `xml:"RespuestaServicioFacturacion"`
}

type SolicitudServicioVerificacionEstadoFactura struct {
	CodigoAmbiente        int    `xml:"codigoAmbiente"`
	CodigoDocumentoSector int    `xml:"codigoDocumentoSector"`
	CodigoEmision         int    `xml:"codigoEmision"`
	CodigoModalidad       int    `xml:"codigoModalidad"`
	CodigoPuntoVenta      int    `xml:"codigoPuntoVenta"`
	CodigoSistema         string `xml:"codigoSistema"`
	CodigoSucursal        int    `xml:"codigoSucursal"`
	CUFD                  string `xml:"cufd"`
	CUIS                  string `xml:"cuis"`
	NIT                   string `xml:"nit"`
	TipoFacturaDocumento  int    `xml:"tipoFacturaDocumento"`
	CUF                   string `xml:"cuf"`
}

type VerificacionEstadoFacturaEnvelope struct {
	XMLName xml.Name `xml:"soapenv:Envelope"`
	SoapEnv string   `xml:"xmlns:soapenv,attr"`
	Siat    string   `xml:"xmlns:siat,attr"`
	Header  struct{} `xml:"soapenv:Header"`
	Body    struct {
		Verificacion struct {
			Solicitud SolicitudServicioVerificacionEstadoFactura `xml:"SolicitudServicioVerificacionEstadoFactura"`
		} `xml:"siat:verificacionEstadoFactura"`
	} `xml:"soapenv:Body"`
}

// SOAP Types for Anulacion Factura
type AnulacionFacturaResponse struct {
	XMLName                      xml.Name                     `xml:"anulacionFacturaResponse"`
	RespuestaServicioFacturacion RespuestaServicioFacturacion `xml:"RespuestaServicioFacturacion"`
}

type SolicitudServicioAnulacionFactura struct {
	CodigoAmbiente        int    `xml:"codigoAmbiente"`
	CodigoDocumentoSector int    `xml:"codigoDocumentoSector"`
	CodigoEmision         int    `xml:"codigoEmision"`
	CodigoModalidad       int    `xml:"codigoModalidad"`
	CodigoPuntoVenta      int    `xml:"codigoPuntoVenta"`
	CodigoSistema         string `xml:"codigoSistema"`
	CodigoSucursal        int    `xml:"codigoSucursal"`
	CUFD                  string `xml:"cufd"`
	CUIS                  string `xml:"cuis"`
	NIT                   string `xml:"nit"`
	TipoFacturaDocumento  int    `xml:"tipoFacturaDocumento"`
	CodigoMotivo          int    `xml:"codigoMotivo"`
	CUF                   string `xml:"cuf"`
}

type AnulacionFacturaEnvelope struct {
	XMLName xml.Name `xml:"soapenv:Envelope"`
	SoapEnv string   `xml:"xmlns:soapenv,attr"`
	Siat    string   `xml:"xmlns:siat,attr"`
	Header  struct{} `xml:"soapenv:Header"`
	Body    struct {
		Anulacion struct {
			Solicitud SolicitudServicioAnulacionFactura `xml:"SolicitudServicioAnulacionFactura"`
		} `xml:"siat:anulacionFactura"`
	} `xml:"soapenv:Body"`
}
