package gcpquota

import (
	"context"
	"time"

	"github.com/go-logr/logr"
	"google.golang.org/api/compute/v1"
)

type Quota struct {
	Region string
	Metric string
	Usage  float64
	Limit  float64
}

type QuotaClient interface {
	QueryQuotas(ctx context.Context, project string) ([]Quota, error)
}

var _ QuotaClient = &quotaClient{}

type quotaClient struct {
	logger  logr.Logger
	service *compute.Service
}

func (c *quotaClient) QueryQuotas(ctx context.Context, projectID string) ([]Quota, error) {
	quotas := []Quota{}
	startAt := time.Now()

	project, err := c.service.Projects.Get(projectID).Do()
	if err != nil {
		return nil, err
	}

	regions, err := c.service.Regions.List(projectID).Do()
	if err != nil {
		return nil, err
	}

	for _, quota := range project.Quotas {
		quotas = append(quotas, Quota{
			Region: "global",
			Metric: quota.Metric,
			Usage:  quota.Usage,
			Limit:  quota.Limit,
		})
	}
	for _, region := range regions.Items {
		for _, quota := range region.Quotas {
			quotas = append(quotas, Quota{
				Region: region.Name,
				Metric: quota.Metric,
				Usage:  quota.Usage,
				Limit:  quota.Limit,
			})
		}
	}

	c.logger.Info("got all quotas for a project", "project", projectID, "cost", time.Since(startAt))

	return quotas, nil
}
