package logger

import (
	"fmt"
	"log"
	"os"
	"runtime"
	"strings"
)

var (
	debugMode bool
	logger    *log.Logger
)

func init() {
	mode := os.Getenv("GO_SPEECH_MODE")
	debugMode = (mode != "release")
	logger = log.New(os.Stdout, "", log.LstdFlags|log.Lmicroseconds)
}

// IsDebug возвращает true, если включен режим отладки
func IsDebug() bool {
	return debugMode
}

// Debug логирует сообщение только в режиме отладки
func Debug(format string, v ...interface{}) {
	if debugMode {
		logMessage("DEBUG", format, v...)
	}
}

// Info логирует информационное сообщение
func Info(format string, v ...interface{}) {
	logMessage("INFO", format, v...)
}

// Error логирует сообщение об ошибке
func Error(format string, v ...interface{}) {
	logMessage("ERROR", format, v...)
}

// Warn логирует предупреждение
func Warn(format string, v ...interface{}) {
	logMessage("WARN", format, v...)
}

// DebugWithContext логирует сообщение с контекстом (файл и строка)
func DebugWithContext(format string, v ...interface{}) {
	if debugMode {
		_, file, line, ok := runtime.Caller(1)
		if ok {
			file = file[strings.LastIndex(file, "/")+1:]
			logMessage("DEBUG", fmt.Sprintf("[%s:%d] %s", file, line, format), v...)
		} else {
			logMessage("DEBUG", format, v...)
		}
	}
}

// logMessage форматирует и выводит сообщение
func logMessage(level, format string, v ...interface{}) {
	message := format
	if len(v) > 0 {
		message = fmt.Sprintf(format, v...)
	}
	logger.Printf("[%s] %s", level, message)
}

