// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package elogrus provides a logrus Formatter for events.
// To use for the global logger:
//   logrus.SetFormatter(elogrus.NewFormatter(exporter))
//   logrus.SetOutput(io.Discard)
// and for a Logger instance:
//   logger.SetFormatter(elogrus.NewFormatter(exporter))
//   logger.SetOutput(io.Discard)
//
// If you call elogging.SetExporter, then you can pass nil
// for the exporter above and it will use the global one.
package elogrus

import (
	"context"

	"github.com/sirupsen/logrus"
	"golang.org/x/exp/event"
	"golang.org/x/exp/event/keys"
	"golang.org/x/exp/event/logging/internal"
)

type formatter struct{}

func NewFormatter() logrus.Formatter {
	return &formatter{}
}

var _ logrus.Formatter = (*formatter)(nil)

// Format writes an entry to an event.Exporter. It always returns nil (see below).
// If e.Context is non-nil, Format gets the exporter from the context. Otherwise
// it uses the default exporter.
//
// Logrus first calls the Formatter to get a []byte, then writes that to the
// output. That doesn't work for events, so we subvert it by having the
// Formatter export the event (and thereby write it). That is why the logrus
// Output io.Writer should be set to io.Discard.
func (f *formatter) Format(e *logrus.Entry) ([]byte, error) {
	ctx := e.Context
	if ctx == nil {
		ctx = context.Background()
	}
	b := event.To(ctx).At(e.Time)
	b.With(internal.LevelKey.Of(int(e.Level))) // TODO: convert level
	for k, v := range e.Data {
		b.With(keys.Value(k).Of(v))
	}
	b.Log(e.Message)
	return nil, nil
}
