package log

import (
	"github.com/pingcap/dbaas/billing2/utils/header"
	"github.com/pingcap/dbaas/billing2/utils/user"
	"github.com/pingcap/log"
	"go.uber.org/zap"
)

// Info wrap log method
// Standardize the log printing format and add custom information for printing,
// like MDC for log4j2
func Info(msg string, fields ...zap.Field) {
	if len(msg) == 0 {
		return
	}
	fieldList := appendFields(fields...)
	log.L().WithOptions(zap.AddCallerSkip(1)).Info(msg, fieldList...)
}

func Warn(msg string, fields ...zap.Field) {
	if len(msg) == 0 {
		return
	}
	fieldList := appendFields(fields...)
	log.L().WithOptions(zap.AddCallerSkip(1)).Warn(msg, fieldList...)
}

func Error(msg string, fields ...zap.Field) {
	if len(msg) == 0 {
		return
	}
	fieldList := appendFields(fields...)
	if len(header.GetFunctionTestValue()) != 0 || len(header.GetPressureTestValue()) != 0 {
		log.L().WithOptions(zap.AddCallerSkip(1)).Warn(msg, fieldList...)
	} else {
		log.L().WithOptions(zap.AddCallerSkip(1)).Error(msg, fieldList...)
	}
}

func Fatal(msg string, fields ...zap.Field) {
	if len(msg) == 0 {
		return
	}
	fieldList := appendFields(fields...)
	if len(header.GetFunctionTestValue()) != 0 || len(header.GetPressureTestValue()) != 0 {
		log.L().WithOptions(zap.AddCallerSkip(1)).Warn(msg, fieldList...)
	} else {
		log.L().WithOptions(zap.AddCallerSkip(1)).Fatal(msg, fieldList...)
	}
}

func appendFields(fields ...zap.Field) []zap.Field {
	fieldList := make([]zap.Field, 0)
	if len(header.GetFunctionTestValue()) != 0 {
		fieldList = append(fieldList, zap.Bool("FunctionTest", true))
	}
	if len(header.GetPressureTestValue()) != 0 {
		fieldList = append(fieldList, zap.Bool("PressureTest", true))
	}
	if len(header.GetTraceID()) != 0 {
		fieldList = append(fieldList, zap.String("TraceID", header.GetTraceID()))
	}
	if user.GetCurrentUserID() != 0 {
		fieldList = append(fieldList, zap.Uint("UserID", user.GetCurrentUserID()))
	}
	fieldList = append(fieldList, fields...)
	return fieldList
}

func L() *zap.Logger {
	return log.L()
}
