package winpwn

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

// Info/Success/Warn/Error are winpwn's leveled logger, the analogue of
// pwntools' log.info/log.success/log.warn/log.error. All four write to
// stderr (so they never interleave with a tube's own stdout traffic) and
// are gated by Context.LogLevel -- set Context.LogLevel = LogLevelSilent to
// quiet a script down for scripted/CI use.
func Info(format string, args ...any) {
	logAt(LogLevelInfo, "[*]", format, args...)
}

func Success(format string, args ...any) {
	logAt(LogLevelInfo, "[+]", format, args...)
}

func Warn(format string, args ...any) {
	logAt(LogLevelWarn, "[!]", format, args...)
}

func Error(format string, args ...any) {
	logAt(LogLevelError, "[-]", format, args...)
}

func logAt(level LogLevel, prefix, format string, args ...any) {
	if level < Context.LogLevel {
		return
	}
	msg := fmt.Sprintf(format, args...)
	fmt.Fprintf(os.Stderr, "%s %s %s\n", time.Now().Format("15:04:05"), prefix, msg)
}
