package interceptor

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

	"github.com/gin-gonic/gin"
	"github.com/pingcap/log"
	"github.com/tidbcloud/observability/pkg/common/constants"
	"github.com/tidbcloud/observability/pkg/common/errors"
	"github.com/tidbcloud/observability/pkg/common/message"
	"github.com/tidbcloud/observability/pkg/common/metrics"
	"go.uber.org/zap"
)

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
	msg := fmt.Sprintf("%v", err)
	log.Error("recover err",
		zap.String("error", msg),
		zap.String("Request_URI", requestURI),
		zap.Any("Request_Headers", reqHeaders),
	)
	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)
}
