package middleware

import (
	"kra/pkg/response"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// 全局错误日志实例
var errorLogger *zap.Logger

// ErrorCreator 错误记录创建接口
type ErrorCreator interface {
	CreateError(form, info string) error
}

// 全局错误创建器
var errorCreator ErrorCreator

// SetErrorLogger 设置错误日志
func SetErrorLogger(logger *zap.Logger) {
	errorLogger = logger
}

// SetErrorCreator 设置错误创建器
func SetErrorCreator(creator ErrorCreator) {
	errorCreator = creator
}

// ErrorHandler 错误处理中间件
// 用于统一处理请求过程中产生的错误
func ErrorHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Next()

		// 处理请求过程中产生的错误
		if len(c.Errors) > 0 {
			for _, e := range c.Errors {
				// 记录错误日志
				if errorLogger != nil {
					errorLogger.Error("请求错误",
						zap.String("path", c.Request.URL.Path),
						zap.String("method", c.Request.Method),
						zap.String("error", e.Error()),
					)
				}

				// 保存错误到数据库
				if errorCreator != nil {
					_ = errorCreator.CreateError(c.Request.URL.Path, e.Error())
				}
			}

			// 如果还没有写入响应，返回错误信息
			if !c.Writer.Written() {
				lastErr := c.Errors.Last()
				response.FailWithMessage(lastErr.Error(), c)
			}
		}
	}
}

// ErrorResponse 错误响应结构
type ErrorResponse struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	Detail  string `json:"detail,omitempty"`
}

// HandleError 处理错误并返回响应
func HandleError(c *gin.Context, err error, message string) {
	if errorLogger != nil {
		errorLogger.Error(message,
			zap.String("path", c.Request.URL.Path),
			zap.Error(err),
		)
	}

	// 保存错误到数据库
	if errorCreator != nil {
		_ = errorCreator.CreateError(c.Request.URL.Path, err.Error())
	}

	response.FailWithMessage(message, c)
}
