package main

import (
	"github.com/nspcc-dev/cdn-neofs-sdk/grace"
	"github.com/nspcc-dev/cdn-neofs-sdk/logger"
	"github.com/spf13/viper"
	"go.uber.org/zap"
)

func newLogger(v *viper.Viper) *zap.Logger {
	options := []logger.Option{
		logger.WithLevel(v.GetString("logger.level")),
		logger.WithTraceLevel(v.GetString("logger.trace_level")),

		logger.WithFormat(v.GetString("logger.format")),

		logger.WithSamplingInitial(v.GetInt("logger.sampling.initial")),
		logger.WithSamplingThereafter(v.GetInt("logger.sampling.thereafter")),

		logger.WithAppName(v.GetString("app_name")),
		logger.WithAppVersion(v.GetString("app_version")),
	}

	if v.GetBool("logger.no_caller") {
		options = append(options, logger.WithoutCaller())
	}

	if v.GetBool("logger.no_disclaimer") {
		options = append(options, logger.WithoutDisclaimer())
	}

	l, err := logger.New(options...)
	if err != nil {
		panic(err)
	}

	return l
}

func main() {
	var (
		v = newSettings()
		l = newLogger(v)
		g = grace.Context(l)
		a = newApp(g, l, v)
	)

	go a.Server(g)
	go a.Worker(g)

	a.Wait()
}