package repositories

import (
	"context"
	"daemonService/internal/models"
	bg "daemonService/internal/models/sincronizacionDatos/bodyGeneric"
	"daemonService/internal/models/sincronizacionDatos/request"
	"encoding/json"
	"fmt"
	"time"
)

// func (s *ListaLeyendasFacturaService) guardarRegistro(solicitud models.SolicitudSincronizacionLeyendas, cuisID int, soapReq string, bodyBytes []byte, leyendas []models.LeyendaDetalle) error {
func GuardarRegistro[T any](s *models.ServiceModel, solicitud request.SolicitudSincronizacion, cuisID int, soapReq string, bodyBytes []byte, bodyGeneric T) error {
	dbCtx, dbCancel := context.WithTimeout(context.Background(), 30*time.Minute)
	defer dbCancel()

	tx, err := s.DB.BeginTx(dbCtx, nil)
	if err != nil {
		return fmt.Errorf("error iniciando transacción: %v", err)
	}
	defer func() {
		if err != nil {
			tx.Rollback()
		}
	}()

	solicitudJSON, _ := json.Marshal(solicitud)

	// Creación de la respuesta utilizando la estructura genérica
	respJson := bg.CustomResponse[T]{
		Success: true,
		Status:  200,
		Message: s.MsgCustomResponse,
		Data:    bodyGeneric,
	}

	respuestaJSON, _ := json.Marshal(respJson)

	_, err = tx.ExecContext(dbCtx, s.QueryInsert,
		solicitud.CodigoSistema,
		soapReq,
		string(bodyBytes),
		string(solicitudJSON),
		string(respuestaJSON),
		cuisID,
	)

	//_, err = tx.ExecContext(dbCtx, `
	//   INSERT INTO leyendas_factura (
	//		codigo,
	//		reqSoap,
	//		respSoap,
	//		reqJson,
	//		respJson,
	//		cuis_id,
	//		fecha_creacion
	//	)
	//	VALUES ($1, $2, $3, $4, $5, $6, NOW() AT TIME ZONE 'America/La_Paz')
	//	ON CONFLICT (codigo, cuis_id)
	//	DO UPDATE SET
	//		reqSoap = EXCLUDED.reqSoap,
	//		respSoap = EXCLUDED.respSoap,
	//		reqJson = EXCLUDED.reqJson,
	//		respJson = EXCLUDED.respJson,
	//		cuis_id = EXCLUDED.cuis_id,
	//		fecha_actualizacion = NOW() AT TIME ZONE 'America/La_Paz'`,
	//	solicitud.CodigoSistema,
	//	soapReq,
	//	string(bodyBytes),
	//	string(solicitudJSON),
	//	string(respuestaJSON),
	//	cuisID,
	//)

	if err != nil {
		return fmt.Errorf("error ejecutando UPSERT: %v", err)
	}

	if err := tx.Commit(); err != nil {
		return fmt.Errorf("error confirmando transacción: %v", err)
	}

	return nil
}
