// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.

package apiv1

import (
	"time"

	"github.com/gitpod-io/gitpod/common-go/log"
	db "github.com/gitpod-io/gitpod/components/gitpod-db/go"
)

const (
	defaultPrice = float64(1) / float64(6)
)

var (
	DefaultWorkspacePricer, _ = NewWorkspacePricer(map[string]float64{})
)

func NewWorkspacePricer(creditMinutesByWorkspaceClass map[string]float64) (*WorkspacePricer, error) {
	return &WorkspacePricer{creditMinutesByWorkspaceClass: creditMinutesByWorkspaceClass}, nil
}

type WorkspacePricer struct {
	creditMinutesByWorkspaceClass map[string]float64
}

func (p *WorkspacePricer) CreditsUsedByInstance(instance *db.WorkspaceInstanceForUsage, stopTimeIfStillRunning time.Time) float64 {
	runtime := instance.WorkspaceRuntimeSeconds(stopTimeIfStillRunning)
	return p.Credits(instance.WorkspaceClass, runtime)
}

func (p *WorkspacePricer) Credits(workspaceClass string, runtimeInSeconds int64) float64 {
	inMinutes := float64(runtimeInSeconds) / 60
	return p.CreditsPerMinuteForClass(workspaceClass) * inMinutes
}

func (p *WorkspacePricer) CreditsPerMinuteForClass(workspaceClass string) float64 {
	if creditsForClass, ok := p.creditMinutesByWorkspaceClass[workspaceClass]; ok {
		return creditsForClass
	}
	log.Errorf("no credit minutes configured for workspace class %q - using default", workspaceClass)
	return defaultPrice
}
