package ingest

import (
	"github.com/gin-gonic/gin"
	"go.uber.org/dig"

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver"
	apiutils "github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver/utils"
	"github.com/tidbcloud/aisupport/services/jsm-syncer/internal/app"
	atlassiansyncsvc "github.com/tidbcloud/aisupport/services/jsm-syncer/internal/services/atlassiansync"
	syncstatesvc "github.com/tidbcloud/aisupport/services/jsm-syncer/internal/services/syncstate"
)

type HandlerParam struct {
	dig.In

	SyncState     syncstatesvc.Service
	AtlassianSync atlassiansyncsvc.Service
}

type Handler struct {
	syncState     syncstatesvc.Service
	atlassianSync atlassiansyncsvc.Service
}

func NewHandler(param HandlerParam) app.HandlerResult {
	return app.HandlerResult{
		Handler: &Handler{
			syncState:     param.SyncState,
			atlassianSync: param.AtlassianSync,
		},
	}
}

func (h *Handler) Name() string {
	return "IngestHandler"
}

func (h *Handler) Register(routers map[apiserver.RoutePath]gin.IRouter) error {
	router := routers[app.APIRoutePath]

	router.POST("/internal/events/account", h.HandleAccountEvent)
	router.POST("/internal/events/billing/:event_type", h.HandleBillingEvent)
	router.POST("/internal/events/msp", h.HandleMSPMessage)
	router.POST("/internal/events/lake", h.HandleLakeEvent)
	return nil
}

func fetchBody(c *gin.Context) ([]byte, bool) {
	body, err := apiutils.FetchBody(c)
	if err != nil {
		apiutils.Fail(c, err)
		return nil, false
	}
	return body, true
}

func success(c *gin.Context) {
	apiutils.Success(c, nil)
}
