package tigin

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
	"go.uber.org/zap"
)

func Default() *gin.Engine {
	return DefaultWithServerName("gin")
}

func DefaultRecoveryFunc(c *gin.Context, err interface{}) {
	tilog.Error(c.Request.Context(), "panic triggered", zap.String("panic", fmt.Sprintf("%v", err)))
}

func DefaultWithServerName(serverName string) *gin.Engine {
	engine := gin.New()
	engine.Use(
		gin.Logger(),
		gin.CustomRecovery(DefaultRecoveryFunc),
		RecordMetrics,
		otelgin.Middleware(serverName),
		TraceRequest,
		SetResponseTraceID,
	)
	return engine
}
