package sklog

import (
	"os"

	_logger "github.com/jcgregorio/logger"
	"github.com/jcgregorio/slog"
)

// CloudLoggerSLogImpl implements CloudLogger using slog.Logger.
type CloudLoggerSLogImpl struct {
	stdLog slog.Logger
}

// NewSLogCloudLogger returns a CloudLoggerSLogImpl that uses the given slog.Logger.
func NewSLogCloudLogger(l slog.Logger) *CloudLoggerSLogImpl {
	return &CloudLoggerSLogImpl{
		stdLog: l,
	}
}

// SLogLogMode is the mode logging enum type.
type SLogLogMode int

// Types of logging that NewSLogLogger supports.
const (
	SLogNone SLogLogMode = iota
	SLogStderr
)

// NewSLogLogger creates a new CloudLoggerSLogImpl that either logs to stderr, or does
// no logging, depending upon the value of mode. It uses github.com/jcgregorio/logger
// to implement the slog.Logger interface.
//
// The return value implements CloudLogger.
//
// Usage:
//
//			sklog.SetLogger(sklog.NewStdErrCloudLogger(logToStdErr))
//
func NewStdErrCloudLogger(mode SLogLogMode) *CloudLoggerSLogImpl {
	if mode == SLogStderr {
		return NewSLogCloudLogger(_logger.NewFromOptions(&_logger.Options{SyncWriter: os.Stderr}))
	} else {
		return NewSLogCloudLogger(_logger.NewNopLogger())
	}
}

// See CloudLogger.
func (c *CloudLoggerSLogImpl) CloudLog(reportName string, payload *LogPayload) {
	switch payload.Severity {
	case DEBUG:
		c.stdLog.Debug(payload.Payload)
	case INFO, NOTICE:
		c.stdLog.Info(payload.Payload)
	case WARNING:
		c.stdLog.Warning(payload.Payload)
	case ERROR:
		c.stdLog.Error(payload.Payload)
	case CRITICAL, ALERT:
		c.stdLog.Fatal(payload.Payload)
	}
}

// See CloudLogger.
func (c *CloudLoggerSLogImpl) BatchCloudLog(reportName string, payloads ...*LogPayload) {
	for _, payload := range payloads {
		c.CloudLog(reportName, payload)
	}
}

// See CloudLogger.
func (c *CloudLoggerSLogImpl) Flush() {
	_ = os.Stdout.Sync()
}

// Assert that we implement the ClougLogger interface:
var _ CloudLogger = (*CloudLoggerSLogImpl)(nil)
