package middlewares

import (
	"errors"
	"fmt"
	"time"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/go-logr/logr"

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver/utils"
)

func CorsMiddleware() gin.HandlerFunc {
	return cors.New(cors.Config{
		AllowOrigins:     []string{"*"},
		AllowMethods:     []string{"PUT", "PATCH", "GET", "POST", "DELETE"},
		AllowHeaders:     []string{"Origin", "Authorization", "X-Requested-With", "Content-Type", "Accept"},
		ExposeHeaders:    []string{"Content-Length"},
		AllowCredentials: true,
		AllowOriginFunc: func(origin string) bool {
			return true
		},
		MaxAge: 12 * time.Hour,
	})
}

func RecoveryMiddleware(logger logr.Logger) gin.HandlerFunc {
	return gin.CustomRecovery(func(c *gin.Context, e interface{}) {
		if err, ok := e.(error); ok {
			logger.Error(err, "recovered a panic")
		} else {
			logger.Error(fmt.Errorf("%v", e), "recovered a panic")
		}
		utils.Fail(c, errors.New("internal server error"))
	})
}
