// 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.

//go:build !disable_events
// +build !disable_events

// Package logrus 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 logrus

import (
	"context"

	"github.com/sirupsen/logrus"
	"golang.org/x/exp/event"
	"golang.org/x/exp/event/severity"
)

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()
	}
	ev := event.New(ctx, event.LogKind)
	if ev == nil {
		return nil, nil
	}
	ev.At = e.Time
	ev.Labels = append(ev.Labels, convertLevel(e.Level).Label())
	for k, v := range e.Data {
		ev.Labels = append(ev.Labels, event.Value(k, v))
	}
	ev.Labels = append(ev.Labels, event.String("msg", e.Message))
	ev.Deliver()
	return nil, nil
}

func convertLevel(level logrus.Level) severity.Level {
	switch level {
	case logrus.PanicLevel:
		return severity.Fatal + 1
	case logrus.FatalLevel:
		return severity.Fatal
	case logrus.ErrorLevel:
		return severity.Error
	case logrus.WarnLevel:
		return severity.Warning
	case logrus.InfoLevel:
		return severity.Info
	case logrus.DebugLevel:
		return severity.Debug
	case logrus.TraceLevel:
		return severity.Trace
	default:
		return severity.Trace
	}
}
