package logger

import (
	"bytes"
	"log"
)

type stdLogger struct {
	l     Logger
	level Level
}

// NewStdLogger returns new *log.Logger baked by logger.Logger implementation
func NewStdLogger(l Logger, level Level) *log.Logger {
	return log.New(&stdLogger{l: l, level: level}, "" /* prefix */, 0 /* flags */)
}

func (sl *stdLogger) Write(p []byte) (int, error) {
	p = bytes.TrimSpace(p)
	sl.l.Log(sl.l.Options().Context, sl.level, string(p))
	return len(p), nil
}

// RedirectStdLogger replace *log.Logger with logger.Logger implementation
func RedirectStdLogger(l Logger, level Level) func() {
	flags := log.Flags()
	prefix := log.Prefix()
	writer := log.Writer()
	log.SetFlags(0)
	log.SetPrefix("")
	log.SetOutput(&stdLogger{l: l, level: level})
	return func() {
		log.SetFlags(flags)
		log.SetPrefix(prefix)
		log.SetOutput(writer)
	}
}