package cmd

import (
	"context"
	"time"

	"github.com/sirupsen/logrus"
	"github.com/urfave/cli/v3"

	"git.maze.io/go/ham/protocol/meshcore"
	"git.maze.io/ham/hamview"
)

const (
	FlagQuiet = "quiet"
	FlagDebug = "debug"
	FlagTrace = "trace"
)

func LoggerFlags() []cli.Flag {
	return []cli.Flag{
		&cli.BoolFlag{
			Name:    FlagQuiet,
			Aliases: []string{"q"},
			Usage:   "Disable informational logging",
		},
		&cli.BoolFlag{
			Name:    FlagDebug,
			Aliases: []string{"D"},
			Usage:   "Enable debug level logging",
		},
		&cli.BoolFlag{
			Name:    FlagTrace,
			Aliases: []string{"T"},
			Usage:   "Enable trace level logging",
		},
	}
}

func ConfigureLogging(logger **logrus.Logger) cli.BeforeFunc {
	return func(ctx context.Context, cmd *cli.Command) (context.Context, error) {
		*logger = NewLogger(cmd)
		hamview.Logger = *logger
		return ctx, nil
	}
}

func NewLogger(cmd *cli.Command) *logrus.Logger {
	logger := logrus.New()
	logger.SetFormatter(&logrus.TextFormatter{
		FullTimestamp:   true,
		TimestampFormat: time.RFC3339,
	})

	if cmd != nil {
		if cmd.Bool(FlagTrace) {
			logger.SetLevel(logrus.TraceLevel)
		} else if cmd.Bool(FlagDebug) {
			logger.SetLevel(logrus.DebugLevel)
		} else if cmd.Bool(FlagQuiet) {
			logger.SetLevel(logrus.ErrorLevel)
		}
	}

	// Update package loggers:
	meshcore.Logger = logger

	return logger
}
