package star_resource

import (
	"github.com/gin-gonic/gin"

	"github.com/pingcap-inc/pchub/internal/pkg/code"
	"github.com/pingcap-inc/pchub/pkg/errors"

	srvv1 "github.com/pingcap-inc/pchub/internal/apiserver/service/v1"
	"github.com/pingcap-inc/pchub/internal/apiserver/store"
	"github.com/pingcap-inc/pchub/internal/pkg/middleware"
	"github.com/pingcap-inc/pchub/pkg/log"
	"github.com/pingcap-inc/pchub/pkg/util/ginres"
)

type StarResourceController struct {
	srv srvv1.Service
}

func NewStarResourceController(store store.Factory) *StarResourceController {
	return &StarResourceController{
		srv: srvv1.NewService(store),
	}
}

func (s *StarResourceController) List(c *gin.Context) {
	log.L(c).Info("StarResourceController.List function called.")

	authingId, err := middleware.GetAuthingId(c)
	if err != nil {
		ginres.WriteResponse(c, err, nil)

		return
	}
	user, err := s.srv.User().GetUserByID(c, authingId)
	if err != nil {
		ginres.WriteResponse(c, err, nil)

		return
	}

	res, err := s.srv.StarResource().List(c, user.LarkUserID)
	if err != nil {
		ginres.WriteResponse(c, err, nil)

		return
	}

	ginres.WriteResponse(c, nil, res)
}

func (s *StarResourceController) ToggleStarResource(c *gin.Context) {
	log.L(c).Info("StarResourceController.ToggleStarResource function called.")

	params := ginres.ParseQuery(c, "mid")
	if params["mid"] == "" {
		log.L(c).Error("query param 'mid' is empty")
		ginres.WriteResponse(c, errors.WithCode(code.ErrValidation, "query param 'mid' is empty"), nil)

		return
	}

	authingId, err := middleware.GetAuthingId(c)
	if err != nil {
		ginres.WriteResponse(c, err, nil)

		return
	}
	user, err := s.srv.User().GetUserByID(c, authingId)
	if err != nil {
		ginres.WriteResponse(c, err, nil)

		return
	}

	err = s.srv.StarResource().ToggleStarResource(c, user.LarkUserID, params["mid"])
	if err != nil {
		ginres.WriteResponse(c, err, nil)

		return
	}

	ginres.WriteResponse(c, nil, nil)
}
