package billing

import (
	"github.com/pingcap/dbaas/cost-metering-service/db/entity"
	"github.com/pingcap/dbaas/cost-metering-service/forms"
	"github.com/pingcap/dbaas/cost-metering-service/log"
	"github.com/shopspring/decimal"
	"go.uber.org/zap"
	"time"
)

type CalculateModel struct {
}

func (model *CalculateModel) CalculateCost(costCenterOrgID uint, CalculateDate time.Time) error {
	unitList, err := (&UnitModel{}).GetOrgUnitsByType(costCenterOrgID, entity.UnitSkuType_COST)
	if err != nil {
		return err
	}
	var costUnits []string
	costUnitMap := map[string]forms.UnitInfo{}
	measureUnitList := map[string][]string{}
	for _, unit := range unitList {
		costUnits = append(costUnits, unit.UnitKey)
		costUnitMap[unit.UnitKey] = unit
		var measureUnits []string
		for measureUnit, _ := range unit.MeteringUnits {
			measureUnits = append(measureUnits, measureUnit)
		}
		measureUnitList[unit.UnitKey] = measureUnits
	}

	unitCosts, err := (&MeasureModel{}).GetMeasure(CalculateDate, costUnits)
	for _, costUnit := range unitCosts {
		if costUnit.CostPrice.Equal(decimal.NewFromInt(0)) {
			continue

		}
		err := (&MeasureModel{}).DealMeasureByCost(CalculateDate, costUnit.Unit, measureUnitList[costUnit.Unit], costUnit.CostPrice)
		if err != nil {
			log.Error("failed to  CalculateCost in worker.", zap.Error(err), zap.Uint("cosCenterOrgID", costCenterOrgID),
				zap.Time("CalculateDate", CalculateDate), zap.String("cost unit", costUnit.Unit), zap.Strings("measure unit", measureUnitList[costUnit.Unit]))

		}
	}
	return nil

}
