package gcp

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

	. "github.com/onsi/gomega"
	"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) {
	g := NewGomegaWithT(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"},
	)
	g.Expect(err).To(BeNil())

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

	res, err := client.query(ctx, sql)
	g.Expect(err).To(BeNil())
	g.Expect(len(res)).To(Equal(10))
	//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) {
	g := NewGomegaWithT(t)
	request := global.Request{
		TenantID:  "1",
		ProjectID: "1",
		StartTime: "2022-03-11 19:00:00",
		EndTime:   "2022-03-11 23:00:00",
	}
	args := BigQueryParam{Request: request, BigQuerySharedParam: BigQuerySharedParam{Table: BIGQUERY_TABLE_NAME, BillProject: "pingcap-gardener"}}
	sql1, err := CreateBigquerySQL(args)
	g.Expect(err).To(BeNil())
	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)
	g.Expect(err).To(BeNil())
	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) {
	g := NewGomegaWithT(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"},
	)
	g.Expect(err).To(BeNil())
	log.SetLevel(zapcore.DebugLevel)
	log.L().Sugar()
	request := commonRequest
	ctx := context.Background()
	rows, err := client.ExecProviderCostQuery(ctx, request)
	g.Expect(err).To(BeNil())

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

}

func TestGetProviderCost(t *testing.T) {
	g := NewGomegaWithT(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"},
	)
	g.Expect(err).To(BeNil())
	log.SetLevel(zapcore.DebugLevel)
	log.L().Sugar()
	request := commonRequest
	ctx := context.Background()

	items, err := client.GetProviderCost(ctx, request)
	g.Expect(err).To(BeNil())
	//for _, item := range items {
	//	fmt.Printf("%#v\n", item)
	//}

	g.Expect(len(items)).To(Equal(0))
}

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