package v1

import (
	"context"

	"github.com/pingcap-inc/pchub/internal/apiserver/store"
	v1 "github.com/pingcap-inc/pchub/model/v1"
	"github.com/pingcap-inc/pchub/pkg/log"
)

type budgetService struct {
	store store.Factory
}

type BudgetSrv interface {
	ListLatestFY(c context.Context, mid string, years int) ([]*v1.BudgetCalcItem, error)
	Create(c context.Context, budget *v1.CloudResourceBudget) (*v1.CloudResourceBudget, error)
	UpdateBudget(_ context.Context, rid uint64, mon string, amount float64) error
}

var _ BudgetSrv = (*budgetService)(nil)

func newBudget(srv *service) *budgetService {
	return &budgetService{store: srv.store}
}

func (b *budgetService) ListLatestFY(c context.Context, mid string, years int) ([]*v1.BudgetCalcItem, error) {
	log.L(c).Info("BudgetSrv.List service function called")

	r, err := b.store.CloudResource().Get(c, &v1.CloudResource{ManagementID: mid})
	if err != nil {
		return nil, err
	}

	return b.store.CloudBudget().ListLatestFYResourceBudgets(c, r.ID, years)
}

func (b *budgetService) Create(c context.Context, budget *v1.CloudResourceBudget) (*v1.CloudResourceBudget, error) {
	return b.store.CloudBudget().Create(c, budget)
}

func (b *budgetService) UpdateBudget(_ context.Context, rid uint64, mon string, amount float64) error {
	return b.store.CloudBudget().UpdateBudget(context.Background(), rid, mon, amount)
}
