package http_gateway

import (
	"common/net/http/http_resp"
	"common/utils"
	"fmt"
	"gateway/config"
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
	"strings"
	"time"
)

func corsConfig() cors.Config {
	return cors.Config{
		AllowMethods:     []string{"GET", "POST", "OPTIONS"},
		AllowHeaders:     []string{"Content-Type", "Authorization"},
		AllowCredentials: false,
		AllowAllOrigins:  true,
		MaxAge:           12 * time.Hour,
	}
}

func ginLogger(logger *zap.SugaredLogger) gin.HandlerFunc {
	return func(c *gin.Context) {
		start := time.Now()
		path := c.Request.URL.Path
		c.Next()
		cost := time.Since(start)

		logger.Infof(fmt.Sprintf(
			"HTTP Method:%v Code:%v Time:%v IP:%v Path:%v",
			c.Request.Method,
			c.Writer.Status(),
			cost,
			c.ClientIP(),
			path),
		)
	}
}

func authJwt() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 如果是Public接口，有Token就读，没有就算了
		public := false
		for _, path := range config.PublicPaths {
			if strings.HasPrefix(c.Request.URL.Path, path) {
				public = true
				break
			}
		}

		token := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ")
		if token == "" {
			if public {
				c.Next()
				return
			}
			http_resp.AbortUnauthorized(c)
			return
		}
		claims, err := utils.ParseToken(token, config.Get().Auth.Secret)
		if err != nil {
			if public {
				c.Next()
				return
			}
			http_resp.AbortUnauthorized(c)
			return
		}

		// 这里将Header写到请求中，grpc-gateway框架会读取然后传给grpc服务
		c.Request.Header.Set("X-Usn", strconv.Itoa(int(claims.USN)))
		c.Next()
	}
}
