package v1

import (
	"context"
	"net/http"

	"github.com/google/uuid"
	"github.com/hay-kot/homebox/backend/internal/core/services"
	"github.com/hay-kot/homebox/backend/internal/sys/validate"
	"github.com/hay-kot/httpkit/errchain"
	"github.com/hay-kot/httpkit/server"
	"github.com/rs/zerolog/log"
)

type ActionAmountResult struct {
	Completed int `json:"completed"`
}

func actionHandlerFactory(ref string, fn func(context.Context, uuid.UUID) (int, error)) errchain.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) error {
		ctx := services.NewContext(r.Context())

		totalCompleted, err := fn(ctx, ctx.GID)
		if err != nil {
			log.Err(err).Str("action_ref", ref).Msg("failed to run action")
			return validate.NewRequestError(err, http.StatusInternalServerError)
		}

		return server.JSON(w, http.StatusOK, ActionAmountResult{Completed: totalCompleted})
	}
}

// HandleEnsureAssetID godoc
//
//	@Summary     Ensure Asset IDs
//	@Description Ensures all items in the database have an asset ID
//	@Tags        Actions
//	@Produce     json
//	@Success     200     {object} ActionAmountResult
//	@Router      /v1/actions/ensure-asset-ids [Post]
//	@Security    Bearer
func (ctrl *V1Controller) HandleEnsureAssetID() errchain.HandlerFunc {
	return actionHandlerFactory("ensure asset IDs", ctrl.svc.Items.EnsureAssetID)
}

// HandleEnsureImportRefs godoc
//
//	@Summary  Ensures Import Refs
//	@Description  Ensures all items in the database have an import ref
//	@Tags     Actions
//	@Produce  json
//	@Success  200     {object} ActionAmountResult
//	@Router   /v1/actions/ensure-import-refs [Post]
//	@Security Bearer
func (ctrl *V1Controller) HandleEnsureImportRefs() errchain.HandlerFunc {
	return actionHandlerFactory("ensure import refs", ctrl.svc.Items.EnsureImportRef)
}

// HandleItemDateZeroOut godoc
//
//	@Summary      Zero Out Time Fields
//	@Description  Resets all item date fields to the beginning of the day
//	@Tags         Actions
//	@Produce      json
//	@Success      200     {object} ActionAmountResult
//	@Router       /v1/actions/zero-item-time-fields [Post]
//	@Security Bearer
func (ctrl *V1Controller) HandleItemDateZeroOut() errchain.HandlerFunc {
	return actionHandlerFactory("zero out date time", ctrl.repo.Items.ZeroOutTimeFields)
}

// HandleSetPrimaryPhotos godoc
//
//	@Summary     Set Primary Photos
//	@Description Sets the first photo of each item as the primary photo
//	@Tags        Actions
//	@Produce     json
//	@Success     200     {object} ActionAmountResult
//	@Router      /v1/actions/set-primary-photos [Post]
//	@Security    Bearer
func (ctrl *V1Controller) HandleSetPrimaryPhotos() errchain.HandlerFunc {
	return actionHandlerFactory("ensure asset IDs", ctrl.repo.Items.SetPrimaryPhotos)
}
