package middleware

import (
	"net/http"

	"github.com/gin-gonic/gin"

	apierrors "github.com/user-management-system/internal/pkg/errors"
)

// ErrorHandler 错误处理中间件
func ErrorHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Next()

		// 检查是否有错误
		if len(c.Errors) > 0 {
			// 获取最后一个错误
			err := c.Errors.Last()

			// 判断错误类型
			if appErr, ok := err.Err.(*apierrors.ApplicationError); ok {
				c.JSON(int(appErr.Code), appErr)
			} else {
				// 安全修复：未知错误不泄露内部详情，只返回通用消息
				// 详细错误记录到日志，供调试使用
				c.JSON(http.StatusInternalServerError, apierrors.New(http.StatusInternalServerError, "", "服务器内部错误"))
			}
			return
		}
	}
}

// Recover 恢复中间件
func Recover() gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				c.JSON(http.StatusInternalServerError, apierrors.New(http.StatusInternalServerError, "", "服务器内部错误"))
				c.Abort()
			}
		}()
		c.Next()
	}
}
