package sklog

import (
	"context"

	"cloud.google.com/go/logging"
	"golang.org/x/oauth2"
	"google.golang.org/api/option"
)

// cloudLogger is a CloudLogger which uses the non-deprecated
// cloud.google.com/go/logging package.
type cloudLogger struct {
	logger *logging.Logger
}

// NewCloudLogger returns a CloudLogger instance.
func NewCloudLogger(ctx context.Context, projectId, logId string, ts oauth2.TokenSource, labels map[string]string) (*cloudLogger, error) {
	logsClient, err := logging.NewClient(ctx, projectId, option.WithTokenSource(ts))
	if err != nil {
		return nil, err
	}
	logger := logsClient.Logger(logId, logging.CommonLabels(labels))
	Infof("Connected Cloud Logging; logs can be found here: https://pantheon.corp.google.com/logs/viewer?project=%s&resource=gce_instance&logName=projects%%2F%s%%2Flogs%%2F%s", projectId, projectId, logId)
	return &cloudLogger{
		logger: logger,
	}, nil
}

// Return the logging.Logger.
func (cl *cloudLogger) Logger() *logging.Logger {
	return cl.logger
}

// See documentation for CloudLogger interface.
func (cl *cloudLogger) CloudLog(reportName string, payload *LogPayload) {
	cl.logger.Log(logging.Entry{
		Payload:   payload.Payload,
		Timestamp: payload.Time,
		Severity:  logging.ParseSeverity(payload.Severity),
		Labels:    payload.ExtraLabels,
	})
}

// See documentation for CloudLogger interface.
func (cl *cloudLogger) BatchCloudLog(reportName string, payloads ...*LogPayload) {
	// The logging.Logger struct doesn't directly support batch logging.
	// Send each payload individually.
	for _, payload := range payloads {
		cl.CloudLog(reportName, payload)
	}
}

// See documentation for CloudLogger interface.
func (cl *cloudLogger) Flush() {
	if err := cl.logger.Flush(); err != nil {
		Errorf("Failed to flush logging.Logger: %s", err)
	}
}
