package procesar

import (
	"daemonService/internal/models/obtencionCodigos"
	"daemonService/internal/models/obtencionCodigos/request"
	"daemonService/internal/models/obtencionCodigos/response"
	oc "daemonService/internal/soap/obtencionCodigo"
	"fmt"
	"log"
	"net/http"
)

type ProcesarRegistro struct {
	CuisServiceModel obtencionCodigos.CuisServiceModel
}

// instaciamos procesarRegistro
func NewProcesarRegistro(
	cuisServiceModel obtencionCodigos.CuisServiceModel,
) *ProcesarRegistro {
	return &ProcesarRegistro{CuisServiceModel: cuisServiceModel}
}

func (s *ProcesarRegistro) CodigoProcesarRegistro(solicitud request.SolicitudCuisCufd) (interface{}, interface{}, error) {

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

	// cargamos las variables apikey y su token
	s.CuisServiceModel.TokenKey = solicitud.KeyToken
	s.CuisServiceModel.TokenValue = solicitud.ValueToken

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

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

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

	// 4. Parsear respuesta
	var respCuis response.SoapBodyCuis
	var respCufd response.SoapBodyCufd

	switch solicitud.Cuis {
	case "":
		respCuis, err = oc.CuisParsearRespSOAP[[]response.CuisResponse](&s.CuisServiceModel, bodyBytes)
		if err != nil {
			fmt.Printf("error parseando respuesta: %v", err)
			return nil, nil, fmt.Errorf("error parseando respuesta: %v", err)
		}
		break
	default:
		respCufd, err = oc.CufdParsearRespSOAP[[]response.CufdResponse](&s.CuisServiceModel, bodyBytes)
		if err != nil {
			fmt.Printf("error parseando respuesta: %v", err)
			return nil, nil, fmt.Errorf("error parseando respuesta: %v", err)
		}
		break
	}

	// 4. Parsear respuesta
	//var leyendas any
	//switch s.TagNames {
	//case "sincronizarListaLeyendasFactura":
	//	leyendas, err = soap.ParsearRespLeyendaFacturaSOAP[[]response.LeyendaDetalle](s, bodyBytes)
	//	//leyendas, err := soap.ParsearRespLeyendaFacturaSOAP(s, bodyBytes)
	//	if err != nil {
	//		return fmt.Errorf("error parseando respuesta: %v", err)
	//	}
	//	break
	//case "sincronizarParametricaTipoDocumentoIdentidad":
	//	leyendas, err = soap.ParsearRespTipoDocumentoSOAP[[]response.CodigoDetalle](s, bodyBytes)
	//	if err != nil {
	//		return fmt.Errorf("error parseando respuesta: %v", err)
	//	}
	//	break
	//default:
	//	log.Println("no ingreso por ninguna de las opciones")
	//}

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

	//return nil
	return respCuis, respCufd, nil
}
