package lark

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

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver/middlewares"
	larkcli "github.com/tidbcloud/aisupport/packages/sdk-go/infra/lark/client"
	larkevent "github.com/tidbcloud/aisupport/packages/sdk-go/infra/lark/event"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/lark/login"
	"github.com/tidbcloud/aisupport/services/ticket-manager/internal/app"
	"github.com/tidbcloud/aisupport/services/ticket-manager/internal/consts"
)

type LarkHandlerParam struct {
	dig.In

	LarkEventDispatcher *larkevent.LarkEventDispatcher
	LarkCardDispatcher  *larkevent.LarkCardDispatcher
	LarkLoginDispatcher larkevent.LarkLoginDispatcher
	LarkClient          *larkcli.LarkClient
}

type LarkHandler struct {
	eventDispatcher *larkevent.LarkEventDispatcher
	cardDispatcher  *larkevent.LarkCardDispatcher
	loginDispatcher larkevent.LarkLoginDispatcher
	client          *larkcli.LarkClient
}

func NewLarkHandler(param LarkHandlerParam) app.HandlerResult {
	handler := &LarkHandler{
		eventDispatcher: param.LarkEventDispatcher,
		cardDispatcher:  param.LarkCardDispatcher,
		loginDispatcher: param.LarkLoginDispatcher,
		client:          param.LarkClient,
	}
	return app.HandlerResult{
		Handler: handler,
	}
}

func (h *LarkHandler) Name() string {
	return "LarkHandler"
}

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

	mwBuilder := middlewares.LarkMiddlewareBuiler{
		EncryptKey:        h.client.Conf.EncryptKey,
		VerificationToken: h.client.Conf.VerificationToken,
	}
	loginBuilder := login.NewLoginAPIBuilder(login.Config{
		ClientID:        h.client.Conf.AppCode,
		ClientSecret:    h.client.Conf.AppSecret,
		CookieSecret:    "devops.pingcap.com",
		BaseURL:         consts.ServerAddr() + string(app.PublicRoutePath) + "/channels/lark/login",
		TokenStore:      h.client.TokenStore,
		LoginDispatcher: h.loginDispatcher,
	})

	g := router.Group("/channels/lark")

	eventG := g.Group("/events").Use(mwBuilder.EventMiddleware())
	{
		eventG.POST("", h.HandleLarkEvent)
	}

	larkG := g.Group("/card").Use(mwBuilder.CardMiddleware())
	{
		larkG.POST("", h.HandleLarkCard)
	}

	loginG := g.Group("/login")
	loginBuilder.ReigsterAPIs(loginG)

	return nil
}
