package middleware

import (
	"bytes"
	"gin-vue-admin/init/qmlog"
	"net/http/httputil"
	"strings"
	"time"

	"github.com/gin-gonic/gin"
)

func Logger() gin.HandlerFunc {
	log := qmlog.QMLog
	return func(c *gin.Context) {
		// request time
		start := time.Now()
		// request path
		path := c.Request.URL.Path
		logFlag := true
		if strings.Contains(path, "swagger") {
			logFlag = false
		}
		// request ip
		clientIP := c.ClientIP()
		// method
		method := c.Request.Method
		// copy request content
		req, _ := httputil.DumpRequest(c.Request, true)
		if logFlag {
			log.Infof(`| %s | %s | %s | %5s | %s\n`,
				`Request :`, method, clientIP, path, string(req))
		}
		// replace writer
		cusWriter := &responseBodyWriter{
			ResponseWriter: c.Writer,
			body:           bytes.NewBufferString(""),
		}
		c.Writer = cusWriter
		// handle request
		c.Next()
		// ending time
		end := time.Now()
		//execute time
		latency := end.Sub(start)
		statusCode := c.Writer.Status()
		if logFlag {
			log.Infof(`| %s | %3d | %13v | %s \n`,
				`Response:`,
				statusCode,
				latency,
				cusWriter.body.String())
		}
	}
}

type responseBodyWriter struct {
	gin.ResponseWriter
	body *bytes.Buffer
}

func (w responseBodyWriter) Write(b []byte) (int, error) {
	w.body.Write(b)
	return w.ResponseWriter.Write(b)
}