package telemetry

import (
	"io"
	"log/slog"
	"os"
	"path/filepath"
	"strings"

	"gopkg.in/natefinch/lumberjack.v2"
)

// LoggerConfig configures structured logging for the service.
type LoggerConfig struct {
	ServiceName string
	Level       string
	LogFile     string
}

// NewLogger creates a JSON logger that writes to stdout and optionally to a rotating log file.
func NewLogger(cfg LoggerConfig) *slog.Logger {
	writers := []io.Writer{os.Stdout}

	if path := strings.TrimSpace(cfg.LogFile); path != "" {
		if dir := filepath.Dir(path); dir != "" && dir != "." {
			_ = os.MkdirAll(dir, 0o755)
		}
		writers = append(writers, &lumberjack.Logger{
			Filename:   path,
			MaxSize:    10,
			MaxBackups: 10,
			MaxAge:     10,
			Compress:   true,
		})
	}

	handler := slog.NewJSONHandler(io.MultiWriter(writers...), &slog.HandlerOptions{
		Level:     parseLevel(cfg.Level),
		AddSource: true,
	})
	return slog.New(handler).With("service", cfg.ServiceName)
}

func parseLevel(level string) slog.Level {
	switch strings.ToLower(level) {
	case "debug":
		return slog.LevelDebug
	case "warn", "warning":
		return slog.LevelWarn
	case "error":
		return slog.LevelError
	default:
		return slog.LevelInfo
	}
}
