package logger

import (
	"log/slog"
	"os"
	"strings"

	"github.com/lmittmann/tint"
)

var defaultLogger *slog.Logger

// InitLogger инициализирует логгер slog по умолчанию на основе предоставленного уровня и формата.
func InitLogger(levelStr, format string) *slog.Logger {
	var level slog.Level
	switch strings.ToLower(levelStr) {
	case "debug":
		level = slog.LevelDebug
	case "info":
		level = slog.LevelInfo
	case "warn":
		level = slog.LevelWarn
	case "error":
		level = slog.LevelError
	default:
		level = slog.LevelInfo
	}

	var handler slog.Handler
	output := os.Stdout

	switch strings.ToLower(format) {
	case "json":
		handler = slog.NewJSONHandler(output, &slog.HandlerOptions{
			Level: level,
		})
	case "text":
		handler = tint.NewHandler(output, &tint.Options{
			Level:      level,
			TimeFormat: "15:04:05", // HH:MM:SS
			AddSource:  false,      // Optional: set to true to add file:line
		})
	default:
		handler = tint.NewHandler(output, &tint.Options{
			Level:      level,
			TimeFormat: "15:04:05",
			AddSource:  false,
		}) // Default to colored Text if unknown
	}

	defaultLogger = slog.New(handler)
	slog.SetDefault(defaultLogger)
	return defaultLogger
}

// NewLoggerWithOp создает новый экземпляр логгера с установленным полем "op".
func NewLoggerWithOp(op string) *slog.Logger {
	if defaultLogger == nil {
		// Fallback if InitLogger was not called, though it should be.
		defaultLogger = InitLogger("info", "text")
	}
	return defaultLogger.With(slog.String("op", op))
}
