package middleware

import (
	"strconv"
	"time"

	"github.com/nitezs/sub2clash/logger"

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

func ZapLogger() gin.HandlerFunc {
	return func(c *gin.Context) {
		startTime := time.Now()

		c.Next()

		endTime := time.Now()
		latencyTime := endTime.Sub(startTime).Milliseconds()
		reqMethod := c.Request.Method
		reqURI := c.Request.RequestURI
		statusCode := c.Writer.Status()
		clientIP := c.ClientIP()

		logger.Logger.Info(
			"Request",
			zap.Int("status", statusCode),
			zap.String("method", reqMethod),
			zap.String("uri", reqURI),
			zap.String("ip", clientIP),
			zap.String("latency", strconv.Itoa(int(latencyTime))+"ms"),
		)

		if len(c.Errors) > 0 {
			for _, e := range c.Errors.Errors() {
				logger.Logger.Error(e)
			}
		}
	}
}