package log

import (
	"fmt"
	"github.com/UpmeshLTD/urus-aio/cronjob/config"
	"github.com/UpmeshLTD/urus-aio/infrastructure/logging"
	"github.com/google/uuid"
	"time"
)

// Logger is the logger abstraction. It largely follows logrus/zap structure.
//go:generate mockery --name=Logger --case=snake
type Logger interface {
	logging.Logger
}

func NewLogger(config config.Config) Logger {
	a := config.GetAppConfig()
	c := config.GetAWSConfig().CloudWatchLog

	loggerConfig := logging.LoggerConfig{
		Level:     a.LogLevel,
		Colorized: a.EnableLogColorized,
	}

	if a.EnableLogCloudWatch && c.GroupName != "" {
		loggerConfig.CloudWatchLog = &logging.CloudWatchLogConfig{
			Region:         config.GetAWSConfig().Region,
			GroupName:      c.GroupName,
			StreamName:     c.StreamName,
			BatchFrequency: time.Second * time.Duration(c.BatchFrequency),
		}

		if c.StreamName == "" && c.StreamNamePrefix != "" {
			loggerConfig.CloudWatchLog.StreamName = fmt.Sprintf("%s - %s", c.StreamNamePrefix, uuid.New().String())
		}
	}

	return logging.NewZerologLogger(loggerConfig)
}
