package observability

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

	"git.warky.dev/wdevs/amcs/internal/config"
)

func NewLogger(cfg config.LoggingConfig) (*slog.Logger, error) {
	level, err := parseLevel(cfg.Level)
	if err != nil {
		return nil, err
	}

	options := &slog.HandlerOptions{Level: level}
	handler, err := newHandler(cfg.Format, os.Stdout, options)
	if err != nil {
		return nil, err
	}

	return slog.New(handler), nil
}

func parseLevel(value string) (slog.Leveler, error) {
	switch strings.ToLower(strings.TrimSpace(value)) {
	case "", "info":
		return slog.LevelInfo, nil
	case "debug":
		return slog.LevelDebug, nil
	case "warn", "warning":
		return slog.LevelWarn, nil
	case "error":
		return slog.LevelError, nil
	default:
		return nil, fmt.Errorf("invalid logging.level %q", value)
	}
}

func newHandler(format string, w io.Writer, opts *slog.HandlerOptions) (slog.Handler, error) {
	switch strings.ToLower(strings.TrimSpace(format)) {
	case "", "json":
		return slog.NewJSONHandler(w, opts), nil
	case "text":
		return slog.NewTextHandler(w, opts), nil
	default:
		return nil, fmt.Errorf("invalid logging.format %q", format)
	}
}
