package log

import (
	"github.com/ThreeDotsLabs/watermill"
	"github.com/pingcap/log"
	"go.uber.org/zap"
)

type PingCAPLoggerWatermillAdapter struct {
	fields watermill.LogFields
}

func (l PingCAPLoggerWatermillAdapter) unpackLogFields(fields watermill.LogFields) []zap.Field {
	result := make([]zap.Field, len(l.fields)+len(fields))
	index := 0
	for key, val := range l.fields.Add(fields) {
		result[index] = zap.Any(key, val)
		index++
	}
	return result
}

func (l PingCAPLoggerWatermillAdapter) Error(msg string, err error, fields watermill.LogFields) {
	unpackedFields := l.unpackLogFields(fields)
	log.Error(msg, append(unpackedFields, zap.Error(err))...)
}

func (l PingCAPLoggerWatermillAdapter) Info(msg string, fields watermill.LogFields) {
	unpackedFields := l.unpackLogFields(fields)
	log.Info(msg, unpackedFields...)
}

func (l PingCAPLoggerWatermillAdapter) Debug(msg string, fields watermill.LogFields) {
	unpackedFields := l.unpackLogFields(fields)
	log.Debug(msg, unpackedFields...)
}

func (l PingCAPLoggerWatermillAdapter) Trace(msg string, fields watermill.LogFields) {
	unpackedFields := l.unpackLogFields(fields)
	log.Info(msg, unpackedFields...)
}

func (l PingCAPLoggerWatermillAdapter) With(fields watermill.LogFields) watermill.LoggerAdapter {
	return &PingCAPLoggerWatermillAdapter{fields: fields}
}
