package sincronizacionDatos

import (
	"daemonService/internal/models"
	"daemonService/internal/models/sincronizacionDatos/request"
	"daemonService/internal/repositories"
	"daemonService/internal/services/utils"
	"daemonService/internal/soap"
	"fmt"
	"log"
	"net/http"
)

func ProcesarRegistro(s *models.ServiceModel, solicitud request.SolicitudSincronizacion, cuisID int) (interface{}, error) {

	log.Printf("Procesando código sistema: %s", solicitud.CodigoSistema)

	// 1. Generar solicitud SOAP
	soapReq, err := GenerarSOAPRequest(s, solicitud)
	if err != nil {
		return nil, fmt.Errorf("error generando SOAP: %v", err)
	}

	// 2. Enviar solicitud con reintentos
	resp, bodyBytes, err := soap.EnviarSOAPRequest(s, soapReq)
	if err != nil {
		return nil, fmt.Errorf("error enviando SOAP: %v", err)
	}
	defer resp.Body.Close()

	// 3. Validar respuesta HTTP
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("código de estado HTTP inválido: %d", resp.StatusCode)
	}

	// 4. Parsear respuesta
	respSincronizacion, err := utils.ProcesarRespuestaSincronizacion(s.TagNames, bodyBytes)
	if err != nil {
		return nil, err
	}

	// 5. Guardar en base de datos
	if err := repositories.GuardarRegistro(s, solicitud, cuisID, soapReq, bodyBytes, respSincronizacion); err != nil {
		return nil, fmt.Errorf("error guardando registro: %v", err)
	}

	return respSincronizacion, nil
}
