package interceptor

import (
	"context"
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/log"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/constants"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/message"
)

func Recover(c *gin.Context, err interface{}) {
	if c == nil || c.Request == nil {
		return
	}

	reqHeaders := http.Header{}
	if c.Request.Header != nil {
		reqHeaders = c.Request.Header.Clone()
		reqHeaders.Del("Authorization")
	}

	requestURI := c.Request.RequestURI

	logMsg := fmt.Sprintf("recover err: %v, requestURI: %s, reqHeaders: %v", err, requestURI, reqHeaders)
	log.Error(logMsg)

	msg := fmt.Sprintf("%v", err)
	//metrics.HandleGlobalBizErrorMetrics(msg)

	status := http.StatusInternalServerError
	result := message.Result{
		Code:    int(errors.UnrecognizedError),
		Message: msg,
	}

	c.JSON(status, result)
	newCtx := context.WithValue(c.Request.Context(), constants.RequestResultCtxKey, result)
	c.Request = c.Request.WithContext(newCtx)
}
