// Package logger 提供基于标准库 log/slog 的结构化日志器封装：
// 统一的 Format / Level 选项，以及按环境区分默认值的 FromEnv 便利函数。
package logger

import (
	"io"
	"log/slog"
	"os"
)

// Format 表示日志输出格式。
type Format string

// 支持的输出格式。
const (
	FormatJSON Format = "json"
	FormatText Format = "text"
)

// Level 是 slog.Level 的类型别名，方便外部直接使用本包常量而无需引入 log/slog。
type Level = slog.Level

// 常用日志级别（与 slog 同名常量等价）。
const (
	LevelDebug = slog.LevelDebug
	LevelInfo  = slog.LevelInfo
	LevelWarn  = slog.LevelWarn
	LevelError = slog.LevelError
)

// Options 控制日志器的输出格式、最低级别、目标 Writer 与是否记录调用位置。
// Writer 留空时默认写入 os.Stdout。
// AddSource 为 true 时日志附带调用文件:行号；零值 false（开发环境噪声大，按需开启）。
type Options struct {
	Format    Format
	Level     Level
	Writer    io.Writer
	AddSource bool
}

// New 按 Options 构造一个 *slog.Logger。Format 非 FormatText 时一律使用 JSON handler。
func New(opt Options) *slog.Logger {
	w := opt.Writer
	if w == nil {
		w = os.Stdout
	}
	hopts := &slog.HandlerOptions{Level: opt.Level, AddSource: opt.AddSource}
	var h slog.Handler
	switch opt.Format {
	case FormatText:
		h = slog.NewTextHandler(w, hopts)
	default:
		h = slog.NewJSONHandler(w, hopts)
	}
	return slog.New(h)
}

// FromEnv 根据环境名返回合适默认：
// - development → text + debug，不含 source（开发噪声大）
// - 其他（production/staging/test）→ json + info，含 source（spec §8.2 caller 必填）
func FromEnv(env string, w io.Writer) *slog.Logger {
	if env == "development" {
		return New(Options{Format: FormatText, Level: LevelDebug, Writer: w})
	}
	return New(Options{Format: FormatJSON, Level: LevelInfo, Writer: w, AddSource: true})
}
