package logger

import (
	"fmt"
	"github.com/loveuer/esgo2dump/log"
	"github.com/loveuer/nf"
	"github.com/loveuer/nf/nft/resp"
	"strconv"
	"time"
	"ultone/internal/opt"
	"ultone/internal/tool"
)

func New() nf.HandlerFunc {

	return func(c *nf.Ctx) error {
		var (
			now   = time.Now()
			logFn func(msg string, data ...any)
			ip    = c.IP()
		)

		traceId := c.Context().Value(nf.TraceKey)
		c.Locals(nf.TraceKey, traceId)

		err := c.Next()

		c.Writer.Header().Set(nf.TraceKey, fmt.Sprint(traceId))
		c.Writer.Header().Add("X-NF-Module", opt.Cfg.Name)

		status, _ := strconv.Atoi(c.Writer.Header().Get(resp.RealStatusHeader))
		duration := time.Since(now)

		msg := fmt.Sprintf("%s | %15s | %d[%3d] | %s | %6s | %s", traceId, ip, c.StatusCode, status, tool.HumanDuration(duration.Nanoseconds()), c.Method(), c.Path())

		switch {
		case status >= 500:
			logFn = log.Error
		case status >= 400:
			logFn = log.Warn
		default:
			logFn = log.Info
		}

		logFn(msg)

		return err
	}
}