package app

import (
	"os"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// makeZapLogger creates a logger for the app; if log level is nil or does not parse
// the default 'Info' level will be used.
func makeZapLogger(logLevel *string) *zap.SugaredLogger {
	// default info level
	zapLevel := zapcore.InfoLevel
	var parseErr error

	// try to parse specified level (if there is one)
	if logLevel != nil {
		parseLevel, err := zapcore.ParseLevel(*logLevel)
		if err != nil {
			parseErr = err
		} else {
			zapLevel = parseLevel
		}
	}

	// make zap config
	config := zap.NewProductionEncoderConfig()
	config.EncodeTime = zapcore.ISO8601TimeEncoder
	config.LineEnding = "\n"

	// no stack trace
	config.StacktraceKey = ""

	// make logger
	consoleEncoder := zapcore.NewConsoleEncoder(config)
	core := zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), zapLevel)

	logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel)).Sugar()

	// log deferred parse error if there was one
	if logLevel != nil && parseErr != nil {
		logger.Errorf("failed to parse requested log level \"%s\" (%s)", *logLevel, parseErr)
	}

	return logger
}