package gcp

import (
	"context"
	"fmt"
	"os"
	"strings"
	"testing"

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

var commonRequest global.Request

const (
	GOOGLE_APPLICATION_CREDENTIALS = "GOOGLE_APPLICATION_CREDENTIALS"
)

func TestGCPBigqueryGet(t *testing.T) {
	// if not set credentials skip test
	if os.Getenv(GOOGLE_APPLICATION_CREDENTIALS) == "" {
		t.Skip()
	}

	ctx := context.Background()
	client, err := NewBillingClient("pingcap-gardener", "US",
		BigQuerySharedParam{Table: BIGQUERY_TABLE_NAME, BillProject: "pingcap-gardener"},
	)
	if err != nil {
		panic(err)
	}

	sql := "SELECT * FROM `pingcap-gardener.dbaas_billing.gcp_billing_export_v1_010870_592F9D_20D797` limit 10"

	res, err := client.query(ctx, sql)
	if err != nil {
		panic(err)
	}
	if len(res) != 10 {
		panic("list number not right")
	}
	//fmt.Printf("%#v\n", res[0]["amount_in_pricing_units"])
	for k, v := range res[0] {
		fmt.Printf("%s %+v\n", k, v)
	}
}
func TestCreateBigquerySQL(t *testing.T) {

	request := global.Request{
		TenantID:  "1",
		ProjectID: "1",
		StartTime: "2022-01-11 19:00:00",
		EndTime:   "2022-01-11 23:00:00",
	}
	args := BigQueryParam{Request: request, BigQuerySharedParam: BigQuerySharedParam{Table: BIGQUERY_TABLE_NAME, BillProject: "pingcap-gardener"}}
	sql1, err := CreateBigquerySQL(args)
	if err != nil {
		panic(err)
	}
	fmt.Println(sql1)
	if !(strings.Contains(sql1, "tenant_id =") && strings.Contains(sql1, "project_id =")) {
		t.Logf(sql1)
		panic("sql not ready when project_id not empty")
	}

	args.ProjectID = ""
	sql2, err := CreateBigquerySQL(args)
	if err != nil {
		panic(err)
	}
	if !(strings.Contains(sql2, "tenant_id =") && strings.Contains(sql2, "project_id =") == false) {
		t.Logf(sql2)
		panic("sql not right when project is empty")
	}
	fmt.Println(sql2)

}

func TestExecProviderCostQuery(t *testing.T) {
	// if not set credentials skip test
	if os.Getenv(GOOGLE_APPLICATION_CREDENTIALS) == "" {
		t.Skip()
	}

	client, err := NewBillingClient("pingcap-gardener", "US",
		BigQuerySharedParam{Table: BIGQUERY_TABLE_NAME, BillProject: "pingcap-gardener"},
	)
	if err != nil {
		panic(err)
	}
	log.SetLevel(zapcore.DebugLevel)
	log.L().Sugar()
	request := commonRequest
	ctx := context.Background()
	rows, err := client.ExecProviderCostQuery(ctx, request)
	if err != nil {
		panic(err)
	}

	if len(rows) == 0 {
		panic("rows is more than 0")
	}

}

func TestGetProviderCost(t *testing.T) {
	// if not set credentials skip test
	if os.Getenv(GOOGLE_APPLICATION_CREDENTIALS) == "" {
		t.Skip()
	}

	client, err := NewBillingClient("pingcap-gardener", "US",
		BigQuerySharedParam{Table: BIGQUERY_TABLE_NAME, BillProject: "pingcap-gardener"},
	)
	if err != nil {
		panic(err)
	}
	log.SetLevel(zapcore.DebugLevel)
	log.L().Sugar()
	request := commonRequest
	ctx := context.Background()

	items, err := client.GetProviderCost(ctx, request)
	if err != nil {
		panic(err)
	}
	//for _, item := range items {
	//	fmt.Printf("%#v\n", item)
	//}

	if len(items) == 0 {
		panic("rows is more than 0")
	}

}

func init() {
	commonRequest = global.Request{
		TenantID: "1369847559690647294",
		//ProjectID: "1",
		StartTime: "2022-01-11 03:00:00",
		EndTime:   "2022-01-11 05:00:00",
	}
}
