package logging

import (
	"log/slog"
	"os"
)

// Logger interface allows users to plug in their own logger
type Logger interface {
	Debug(msg string, args ...any)
	Info(msg string, args ...any)
	Warn(msg string, args ...any)
	Error(msg string, args ...any)
}

var defaultLogger Logger = &slogLogger{logger: slog.Default()}

// SetLogger allows users to plug in their own logger
func SetLogger(l Logger) {
	defaultLogger = l
}

// Init initializes the default slog logger with a specific log level
func Init(level string) {
	var slogLevel slog.Level
	switch level {
	case "debug":
		slogLevel = slog.LevelDebug
	case "info":
		slogLevel = slog.LevelInfo
	case "warn":
		slogLevel = slog.LevelWarn
	case "error":
		slogLevel = slog.LevelError
	default:
		slogLevel = slog.LevelInfo
	}

	handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		Level: slogLevel,
	})
	defaultLogger = &slogLogger{logger: slog.New(handler)}
}

// Default slog implementation
type slogLogger struct {
	logger *slog.Logger
}

func (s *slogLogger) Debug(msg string, args ...any) { s.logger.Debug(msg, args...) }
func (s *slogLogger) Info(msg string, args ...any)  { s.logger.Info(msg, args...) }
func (s *slogLogger) Warn(msg string, args ...any)  { s.logger.Warn(msg, args...) }
func (s *slogLogger) Error(msg string, args ...any) { s.logger.Error(msg, args...) }

// Package-level functions for convenience
func Debug(msg string, args ...any) { defaultLogger.Debug(msg, args...) }
func Info(msg string, args ...any)  { defaultLogger.Info(msg, args...) }
func Warn(msg string, args ...any)  { defaultLogger.Warn(msg, args...) }
func Error(msg string, args ...any) { defaultLogger.Error(msg, args...) }
