package obtencionCodigo

import (
	"context"
	"daemonService/internal/handlers"
	"daemonService/internal/models/obtencionCodigos"
	service "daemonService/internal/services"
	"daemonService/internal/utils"
	"net/http"
)

// maneja la obtención de CUIS
type ObtencionCodigoService struct {
	Model       obtencionCodigos.CuisServiceModel
	CuisService *service.CuisService
	CronHandler *handlers.CronHandler
	ApiHandler  *handlers.APIHandler
}

// crea una nueva instancia del servicio
func NewObtencionCodigoService(
	model obtencionCodigos.CuisServiceModel, cuisService *service.CuisService,
	cronHandler *handlers.CronHandler, apiHandler *handlers.APIHandler,
) *ObtencionCodigoService {
	return &ObtencionCodigoService{
		Model: model, CuisService: cuisService,
		CronHandler: cronHandler, ApiHandler: apiHandler,
	}
}

// maneja la obtención de códigos CUIS
func (s *ObtencionCodigoService) ExecuteGetCode(dbCtx context.Context, w http.ResponseWriter, req *http.Request, isCron bool) (interface{}, error) {
	s.CuisService.LogMessage(utils.LogServiceStart, s.GetName())
	defer s.CuisService.LogMessage(utils.LogServiceEnd, s.GetName())

	var respCuis interface{}
	var err error

	if isCron {
		respCuis, err = s.CronHandler.ProcessCronMode(dbCtx)
	} else {
		respCuis, err = s.ApiHandler.HandleAPIRequest(dbCtx, w, req)
	}

	if err != nil {
		return nil, err
	}
	return respCuis, nil
}

// GetName retorna el nombre del servicio
func (s *ObtencionCodigoService) GetName() string {
	return s.Model.Name
}
