package service

import (
	"context"

	"github.com/spf13/viper"
	"github.com/ucloud/ucloud-sdk-go/services/ubill"
	"github.com/ucloud/ucloud-sdk-go/ucloud"
	"github.com/ucloud/ucloud-sdk-go/ucloud/auth"
	"go.uber.org/zap"

	"github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/store"
	"github.com/pingcap-inc/data-ingestion-tools/model"
	"github.com/pingcap-inc/data-ingestion-tools/pkg/log"
)

type UcSrv interface {
	FetchUcBill(ctx context.Context, monthNow string) ([]model.BillingRecord, error)
}

type ucService struct {
	store store.Factory
}

var _ UcSrv = (*ucService)(nil)

func newUc(str *service) *ucService {
	return &ucService{store: str.store}
}

func (u *ucService) FetchUcBill(ctx context.Context, monthNow string) ([]model.BillingRecord, error) {
	config := ucloud.NewConfig()

	// replace the public/private key by your own
	credential := auth.NewCredential()
	credential.PublicKey = viper.GetString("ucloud.pubKey")
	credential.PrivateKey = viper.GetString("ucloud.priKey")

	billClient := ubill.NewClient(&config, &credential)
	req := billClient.NewListUBillOverviewRequest()
	req.Dimension = ucloud.String("project")
	req.HideUnpaid = ucloud.Int(1)

	// 格式化为2020-08的形式
	req.BillingCycle = ucloud.String(monthNow)

	// send request
	result, err := billClient.ListUBillOverview(req)
	if err != nil {
		log.L(ctx).Error("fetch billing failed", zap.Error(err))

		return nil, err
	}

	var records []model.BillingRecord
	for _, item := range result.Items {
		records = append(records, model.BillingRecord{
			ProjName: item.ProjectName,
			Cost:     item.Amount,
			Date:     monthNow,
		})
	}

	return records, nil
}
