package oauth2

import (
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/auth-server/commons/errs"
	"github.com/tidbcloud/tiinf/transport/http/tigin"

	oauth2_dto "github.com/tidbcloud/auth-server/internal/dto/oauth2"
	tiinf_errs "github.com/tidbcloud/tiinf/errs"
)

func autoBind(c *gin.Context, obj interface{}) error {

	//contenType := c.ContentType()
	//if c.Request.Method == http.MethodGet {
	//	return c.ShouldBind(obj)
	//} else if contenType == gin.MIMEJSON {
	//	return c.ShouldBindJSON(obj)
	//}

	switch c.ContentType() {
	case gin.MIMEJSON:
		return c.ShouldBindJSON(obj)
	default:
		return c.ShouldBind(obj)
	}
}

func responseWithBadRequest(c *gin.Context, err error) {
	c.JSON(http.StatusBadRequest, oauth2_dto.ErrorResponse{
		Error:            errs.ErrOauth2InvalidRequest.Error(),
		ErrorDescription: err.Error(),
	})
	//tilog.Info(c.Request.Context(), "responseWithBadRequest", zap.Error(err))
}

func getAccountUser(c *gin.Context) (*account.User, error) {
	user, ok := c.Get(tigin.CURRENT_USER)
	if ok {
		return user.(*account.User), nil
	}
	return nil, tiinf_errs.NewInternalServerError("getAccountUser failed", nil)
}

// nolint:errcheck
func abort(c *gin.Context, err error) {
	tilog.Info(c.Request.Context(), "", zap.Error(err))
	c.Error(err)
	c.Abort()
}
