package log

import (
	"fmt"
	"os"
)

type MultiLogger []Logger

func (l MultiLogger) Error(f string, v ...any) {
	for _, logger := range l {
		logger.Error(f, v...)
	}
}

func (l MultiLogger) Warn(f string, v ...any) {
	for _, logger := range l {
		logger.Warn(f, v...)
	}
}

func (l MultiLogger) Info(f string, v ...any) {
	for _, logger := range l {
		logger.Info(f, v...)
	}
}

func (l MultiLogger) Debug(f string, v ...any) {
	for _, logger := range l {
		logger.Debug(f, v...)
	}
}

func (l MultiLogger) CallDepthPlus() {
	for _, logger := range l {
		logger.CallDepthPlus()
	}
}

func (l MultiLogger) CallDepthMinus() {
	for _, logger := range l {
		logger.CallDepthMinus()
	}
}

var (
	// gLog are global default LevelLogger
	gLog MultiLogger
)

func init() {
	Reset()
}

func SetDefault(logger MultiLogger) {
	gLog = logger
}

func Default() MultiLogger {
	return gLog
}

func Reset() {
	gLog = MultiLogger{ConsoleWith(LevelDebug, 4)}
}

func Debug(f string, v ...any) {
	gLog.Debug(f, v...)
}

func Info(f string, v ...any) {
	gLog.Info(f, v...)
}

func Warn(f string, v ...any) {
	gLog.Warn(f, v...)
}

func Error(f string, v ...any) {
	gLog.Error(f, v...)
}

func Panic(f string, v ...any) {
	gLog.Error(f, v...)
	panic(fmt.Sprintf(f, v...))
}

func Fatal(f string, v ...any) {
	gLog.Error(f, v...)
	os.Exit(1)
}
