package main

import (
	"fmt"
	"io"
	"os"
	"time"
)

// LogLevel 日志级别
type LogLevel int

const (
	LevelInfo LogLevel = iota
	LevelWarn
	LevelError
)

func (l LogLevel) String() string {
	switch l {
	case LevelInfo:
		return "INFO"
	case LevelWarn:
		return "WARN"
	case LevelError:
		return "ERROR"
	default:
		return "UNKNOWN"
	}
}

// Logger 接口：定义日志行为
type Logger interface {
	Log(level LogLevel, format string, args ...any)
	Info(format string, args ...any)
	Warn(format string, args ...any)
	Error(format string, args ...any)
	SetMinLevel(level LogLevel)
}

// defaultLogger 结构体：默认实现
type defaultLogger struct {
	minLevel LogLevel
	writer   io.Writer
}

// NewLogger 创建新日志实例，默认输出到 os.Stdout
func NewLogger() Logger {
	return &defaultLogger{
		minLevel: LevelInfo,
		writer:   os.Stdout,
	}
}

// NewFileLogger 创建写入文件的日志实例
func NewFileLogger(filename string) (Logger, error) {
	file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		return nil, fmt.Errorf("无法创建日志文件 %s: %w", filename, err)
	}
	return &defaultLogger{
		minLevel: LevelInfo,
		writer:   file,
	}, nil
}

// SetMinLevel 设置最低日志级别
func (l *defaultLogger) SetMinLevel(level LogLevel) {
	l.minLevel = level
}

// Log 核心日志方法
func (l *defaultLogger) Log(level LogLevel, format string, args ...any) {
	if level < l.minLevel {
		return // 低于最小级别，丢弃
	}

	// 构建日志消息：[时间] [级别] 消息
	timestamp := time.Now().Format("2006-01-02 15:04:05")
	message := fmt.Sprintf(format, args...)
	line := fmt.Sprintf("[%s] [%s] %s\n", timestamp, level.String(), message)

	// 写入目标（控制台或文件）
	fmt.Fprint(l.writer, line)
}

// 快捷方法
func (l *defaultLogger) Info(format string, args ...any)  { l.Log(LevelInfo, format, args...) }
func (l *defaultLogger) Warn(format string, args ...any)  { l.Log(LevelWarn, format, args...) }
func (l *defaultLogger) Error(format string, args ...any) { l.Log(LevelError, format, args...) }
