package mw

import (
	"errors"
	"net/http"
	"strconv"

	"github.com/afex/hystrix-go/hystrix"
	"github.com/gin-gonic/gin"
)

// 熔断器, 此组件需要在gin.Recovery中间之前进行调用, 否则可能会导致panic时候, 无法recovery, 正确顺序如下
//r.Use(BreakerWrapper)
//r.Use(gin.Recovery())
func Breaker(c *gin.Context) {
	name := c.Request.Method + "-" + c.Request.RequestURI
	hystrix.Do(name, func() error {
		c.Next()
		statusCode := c.Writer.Status()
		if statusCode >= http.StatusInternalServerError {
			return errors.New("status code " + strconv.Itoa(statusCode))
		}
		return nil
	}, func(e error) error {
		if e == hystrix.ErrCircuitOpen {
			c.String(http.StatusAccepted, "请稍后重试") //todo 修改报错方法
		}
		return e
	})
}