package soap

import (
	"api-soap-facturacion/internal/config"
	"api-soap-facturacion/internal/logger"
	"api-soap-facturacion/internal/soap/api"
	"api-soap-facturacion/internal/soap/api2"
	factOp "api-soap-facturacion/internal/soap/facturacionOperaciones"
	"time"
)

// Clients contiene todos los clientes SOAP disponibles
type Clients struct {
	API1                      api1.Client
	API2                      api2.Client
	API_FACTURACION_OPERACION factOp.Client
}

// crea nuevos clientes SOAP para todas las APIs configuradas
func NewSoapClients(cfg *config.Config, log logger.Logger) *Clients {
	soapLogger := log.With(logger.NewField("component", "soap_client"))

	// Crear cliente para API1
	api1Client := api1.NewClient(
		cfg.Soap.APIs["api1"],
		soapLogger.With(logger.NewField("api", "api1")),
	)

	// Crear cliente para API2
	api2Client := api2.NewClient(
		cfg.Soap.APIs["api2"],
		soapLogger.With(logger.NewField("api", "api2")),
	)

	// Configurar opciones del cliente
	options := &factOp.ClientOptions{
		Timeout: 45 * time.Second,
		// También puedes configurar un cliente HTTP personalizado si necesitas
		// manejar proxies, certificados personalizados, etc.
	}

	// Registro Codigo Punto de Venta
	apifactOperacion := factOp.NewClient(options, cfg.Soap.APIs["facturacionOperaciones"], soapLogger.With(logger.NewField("api", "registroPuntoVenta")))

	return &Clients{
		API1:                      api1Client,
		API2:                      api2Client,
		API_FACTURACION_OPERACION: *apifactOperacion,
	}
}
