package main

import (
	"context"

	log "github.com/sirupsen/logrus"
	"github.com/tidbcloud/metering/pkg/repoter"
)

type Dest struct {
	config *SupplementaryConfig
}

func NewDest(config *SupplementaryConfig) *Dest {
	return &Dest{config: config}
}

func (d *Dest) Repush(ctx context.Context) error {
	var sender repoter.MeasureSender = new(repoter.MeasureAPIImpl)
	skipclusterid := false
	switch d.config.MeteringType {
	case MeteringTypeInstance:
		skipclusterid = false
	case MeteringTypeNetwork:
		skipclusterid = true
	}
	if d.config.DestSQS != "" {
		err := sender.InitMeasureHandler(d.config.Env, d.config.Vendor, skipclusterid, true, d.config.DestSQS)
		if err != nil {
			return err
		}
	} else {
		err := sender.InitMeasureHandler(d.config.Env, d.config.Vendor, skipclusterid, true)
		if err != nil {
			return err
		}
	}
	//load repoter
	billingReportFile := d.config.SourceFile
	billingReportDB, err := GetBillingReportDB(billingReportFile, d.config.ReporterType)
	if err != nil {
		log.Panicf("get billing report db failed. %s", err.Error())
	}
	switch d.config.ReporterType {
	case V2Reporter:
		v2, err := billingReportDB.ListBillingReportsV2(ctx)
		if err != nil {
			log.Panicf("list billing report v2 failed. %s", err.Error())
		}
		for _, v := range v2 {
			//v2 now only support instance metering
			old, err := v.Convert2OldReporter()
			if err != nil {
				log.Panicf("convert v2 to old failed. %s", err.Error())
			}
			err = sender.SendMeasure(ctx, old)
			if err != nil {
				log.Panicf("send measure failed. %s", err.Error())
			}
			log.Infof("push costid %s successes", v.CostID)
		}
	case V1Reporter:
		v1, err := billingReportDB.ListBillingReports(ctx)
		if err != nil {
			log.Panicf("list billing report failed. %s", err.Error())
		}
		for _, v := range v1 {
			err = sender.SendMeasure(ctx, *v)
			if err != nil {
				log.Panicf("send measure failed. %s", err.Error())
			}
			log.Infof("push costid %s successes", v.CostID)
		}
	case OldReporter:
		v1, err := billingReportDB.ListBillingReports(ctx)
		if err != nil {
			log.Panicf("list billing report failed. %s", err.Error())
		}
		for _, v := range v1 {
			err = sender.SendMeasure(ctx, *v)
			if err != nil {
				log.Panicf("send measure failed. %s", err.Error())
			}
			log.Infof("push costid %s successes", v.CostID)
		}
	default:
		log.Panicf("unsupported reporter type %s", d.config.ReporterType)
	}
	log.Infoln("repush succeed")
	return nil

}
