package aws

import (
	"context"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
	"testing"

	"github.com/pingcap/log"
	"github.com/tidbcloud/cost-collect/pkg/global"
	"go.uber.org/zap/zapcore"
)

var sharedParam AthenaSharedParam
var commonReqeust global.Request
var defualtClient *AWSBillingClient

func TestAWSBillingQuery(t *testing.T) {

	client := defualtClient

	log.SetLevel(zapcore.DebugLevel)
	rows, err := client.query(`SELECT * FROM "athenacurcfn_dev_billing"."dev_billing" limit 10;`)
	if err != nil {
		panic(err)
	}

	// schema has one row
	if len(rows)-1 != 10 {
		panic(fmt.Errorf("rows size not right %d", len(rows)))
	}
	//fmt.Println(rows[0].Data)
	//fmt.Println(rows[1].Data)

}

func TestCreateAthenaSQL(t *testing.T) {
	if os.Getenv("AWS_ACCESS_KEY_ID") == "" {
		t.Skip()
	}
	client := defualtClient

	args := AthenaParam{
		Request: global.Request{
			TenantID:  "1372813089188031291",
			ProjectID: "300018",
			StartTime: "2022-02-14 00:00:00",
			EndTime:   "2022-02-15 00:00:00",
		},
		AthenaSharedParam: client.sharedParam,
	}
	sql, err := CreateAthenaSQL(args)
	if err != nil {
		panic(err)
	}
	fmt.Println(sql)
	if !(strings.Contains(sql, `"resource_tags_user_tenant" =`) && strings.Contains(sql, `"resource_tags_user_project" =`)) {
		panic("param not right")
	}

	// check project not exist
	args.ProjectID = ""
	sql, err = CreateAthenaSQL(args)
	if err != nil {
		panic(err)
	}

	fmt.Println(sql)
	if !(strings.Contains(sql, `"resource_tags_user_tenant" =`) && strings.Contains(sql, `"resource_tags_user_project" =`) == false) {
		panic("param not right,resource_tags_user_project shoudn't exist")
	}
}

func TestExecProviderCostQuery(t *testing.T) {
	if os.Getenv("AWS_ACCESS_KEY_ID") == "" {
		t.Skip()
	}
	client := defualtClient

	rows, err := client.ExecProviderCostQuery(context.Background(), commonReqeust)
	if err != nil {
		panic(err)
	}

	log.S().Debugf("rows %d", len(rows))
	for _, v := range rows[0].Data {
		fmt.Println(*v.VarCharValue)
	}
}

func TestGetProviderCost(t *testing.T) {
	if os.Getenv("AWS_ACCESS_KEY_ID") == "" {
		t.Skip()
	}
	client := defualtClient

	items, err := client.GetProviderCost(context.Background(), commonReqeust)
	if err != nil {
		panic(err)
	}
	log.S().Debugf("rows %d", len(items))
	for i := 0; i < 4; i++ {
		fmt.Printf("%#v\n", items[i])
	}

}

func init() {
	sharedParam = AthenaSharedParam{
		Database: "athenacurcfn_dev_billing",
		Table:    "dev_billing",
	}

	commonReqeust = global.Request{
		TenantID:  "1",
		ProjectID: "1",
		StartTime: "2022-01-11 16:00:00",
		EndTime:   "2022-01-11 17:00:00",
	}
	var err error
	defualtClient, err = NewBillingClient("s3://dbaas-dev-billing-reports/result/", 3, sharedParam)
	if err != nil {
		panic(err)
	}

	log.SetLevel(zapcore.DebugLevel)
}

func TestCsvChange(t *testing.T) {
	a, err := strconv.ParseFloat("1.63E-8", 64)
	if err != nil {
		panic(err)
	}
	kv := map[string]float64{"a": a, "b": 0.0000000000000000005}
	str, _ := json.Marshal(kv)
	fmt.Println(string(str))
}
