package billing

import (
	"fmt"
	"strconv"
	"time"

	"go.uber.org/zap"

	. "github.com/tidbcloud/devtier-store-service/utils"
)

var (
	//tableHeader = "day,cost,total_cls,cls,alive_cls,cost/total_cls,cost/cls,cost/alive_cls,cost*30,cost/total_cls*30,cost/cls*30,cost/alive_cls*30,create_time\n"
	tableHeader  = "day,cost,total_cls,cost/total_cls,cost*30,cost/total_cls*30,cls,cost/cls,cost/cls*30,alive_cls,cost/alive_cls,cost/alive_cls*30,create_time,alive_7d_cls,alive_30d_cls\n"
	tableHeader2 = "day,cost,total_cls,cost/total_cls,cost*30,cost/total_cls*30,create_time\n"
)

func S3UpdateObject(logger *zap.Logger, date, cost, clsNum, aClsNum string, tClsNum int64) (err error) {
	logger.Info("S3UpdateObject start...")
	defer logger.Info("S3UpdateObject end...", zap.Error(err))

	logger.Info("S3UpdateObject input param: %s,%s,%d,%s,%s",
		zap.Any(date, cost), zap.Any(aClsNum, clsNum), zap.Any("total_cls", tClsNum))

	costInt, _ := strconv.ParseFloat(cost, 64)
	aClsNumInt, _ := strconv.ParseFloat(aClsNum, 64)
	if aClsNumInt == 0 {
		aClsNumInt = -1
	}
	clsNumInt, _ := strconv.ParseFloat(clsNum, 64)
	if clsNumInt == 0 {
		clsNumInt = -1
	}
	aClsNum7 := GetServerlessClusterNumFromMetrics(logger, date, "7d", true)
	aClsNum30 := GetServerlessClusterNumFromMetrics(logger, date, "30d", true)

	format1 := fmt.Sprintf("%s,%s,%d,%v,%v,%v,%s,%v,%v,%s,%v,%v,%s,%s,%s\n",
		date, cost, tClsNum,
		fmt.Sprintf("%.2f", costInt/float64(tClsNum)), fmt.Sprintf("%.2f", costInt*30), fmt.Sprintf("%.2f", costInt/float64(tClsNum)*30),
		clsNum, fmt.Sprintf("%.2f", costInt/clsNumInt), fmt.Sprintf("%.2f", costInt/clsNumInt*30),
		aClsNum, fmt.Sprintf("%.2f", costInt/aClsNumInt), fmt.Sprintf("%.2f", costInt/aClsNumInt*30),
		time.Now().Format("2006-01-02 15:04:05"), aClsNum7, aClsNum30)

	format2 := fmt.Sprintf("%s,%s,%d,%v,%v,%v,%s\n",
		date, cost, tClsNum,
		fmt.Sprintf("%.2f", costInt/float64(tClsNum)), fmt.Sprintf("%.2f", costInt*30), fmt.Sprintf("%.2f", costInt/float64(tClsNum)*30),
		time.Now().Format("2006-01-02 15:04:05"))
	logger.Info("s3 bucket key content update: ", zap.Any("value", tableHeader+format1))
	logger.Info("s3 bucket key content update: ", zap.Any("value", tableHeader+format2))

	/* for inner version */
	if err = S3KeyAppend(logger, Env+"-devtier-billing", Env+"-devtier-daily-billing-detail.csv", format1); err != nil {
		logger.Error("S3UpdateObject S3KeyAppend failed.", zap.Error(err))
		return err
	}
	if err = S3KeyAppend(logger, Env+"-devtier-billing", Env+"-devtier-daily-billing-finance.csv", format2); err != nil {
		logger.Error("S3UpdateObject S3KeyAppend failed.", zap.Error(err))
		return err
	}
	return
}

/*
func main() {
      var (
              date    = "2022-06-12"
              cost    = "0.03"
              tClsNum  = "100"
              clsNum  = "100"
              aClsNum = "2"
              env = "dev"
      )
      if err:= updateS3Object(date, cost, tClsNum, clsNum, aClsNum, env); err != nil {
              log.Errorf("%v", err)
      }
}
*/
