/*
Copyright (c) Edgeless Systems GmbH

SPDX-License-Identifier: AGPL-3.0-only
*/

package gcp

import (
	"context"
	"fmt"
	"log"

	"cloud.google.com/go/compute/metadata"
	"cloud.google.com/go/logging"
)

// Logger logs to GCP cloud logging. Do not use to log sensitive information.
type Logger struct {
	client *logging.Client
	logger *log.Logger
}

// NewLogger creates a new Cloud Logger for GCP.
// https://cloud.google.com/logging/docs/setup/go
func NewLogger(ctx context.Context, logName string) (*Logger, error) {
	projectID, err := metadata.NewClient(nil).ProjectID()
	if err != nil {
		return nil, fmt.Errorf("retrieving project ID from imds: %w", err)
	}

	client, err := logging.NewClient(ctx, projectID)
	if err != nil {
		return nil, err
	}

	logger := client.Logger(logName).StandardLogger(logging.Info)

	return &Logger{
		client: client,
		logger: logger,
	}, nil
}

// Disclose stores log information in GCP Cloud Logging! Do **NOT** log sensitive
// information!
func (l *Logger) Disclose(msg string) {
	l.logger.Println(msg)
}

// Close waits for all buffer to be written.
func (l *Logger) Close() error {
	return l.client.Close()
}