package verify

import (
	"context"
	"fmt"

	"github.com/pingcap/log"
	"github.com/tidbcloud/billing-verify-bills/pkg/cloud/gcp"
	"github.com/tidbcloud/billing-verify-bills/pkg/global"
)

type Context struct {
	ctx      context.Context
	request  global.Request
	response gcp.BigQueryRows
	err      error
}

type Manager struct {
	gcpClient *gcp.BigQueryClient
}

func NewManager(gcpClient *gcp.BigQueryClient) (*Manager, error) {
	m := Manager{
		gcpClient: gcpClient,
	}
	return &m, nil
}

func (t Manager) VerifyNetworkBill(ctx context.Context, request global.Request) error {
	sql := `WITH Roster AS
	(SELECT 'Adams' as LastName, 50 as SchoolID UNION ALL
	 SELECT 'Buchanan', 52 UNION ALL
	 SELECT 'Coolidge', 52 UNION ALL
	 SELECT 'Davis', 51 UNION ALL
	 SELECT 'Eisenhower', 77)
   SELECT * FROM Roster`

	log.S().Debugf("%s,%s,%s,%s,plugin:%s",
		request.TenantID, request.ProjectID, request.StartTime, request.EndTime, "gcp")

	taskContext := &Context{request: request, ctx: ctx}
	log.S().Debugf("start")

	defer func() {
		if taskContext.err != nil {
			log.S().Errorf("invoke error:", taskContext.err)
		}
		log.S().Debugf("done")
	}()

	response, err := t.gcpClient.ExecQuery(taskContext.ctx, sql, taskContext.request)
	if err != nil {
		return err
	}
	if (len(response)) != 0 {
		return fmt.Errorf("verification failed")
	}

	taskContext.response = response

	return nil
}

// You can write your verification logic with the following template
// func (t Manager) VerifyXXXX(ctx context.Context, request global.Request) error {
// 	sql := `WITH Roster AS
// 	(SELECT 'Adams' as LastName, 50 as SchoolID UNION ALL
// 	 SELECT 'Buchanan', 52 UNION ALL
// 	 SELECT 'Coolidge', 52 UNION ALL
// 	 SELECT 'Davis', 51 UNION ALL
// 	 SELECT 'Eisenhower', 77)
//    SELECT * FROM Roster`

// 	log.S().Debugf("%s,%s,%s,%s,plugin:%s",
// 		request.TenantID, request.ProjectID, request.StartTime, request.EndTime, "gcp")

// 	taskContext := &Context{request: request, ctx: ctx}
// 	log.S().Debugf("start")

// 	defer func() {
// 		if taskContext.err != nil {
// 			log.S().Errorf("invoke error:", taskContext.err)
// 		}
// 		log.S().Debugf("done")
// 	}()

// 	response, err := t.gcpClient.ExecQuery(taskContext.ctx, sql, taskContext.request)
// 	if err != nil {
// 		return err
// 	}
// 	if (len(response)) != 0 {
// 		return fmt.Errorf("verification failed")
// 	}

// 	taskContext.response = response

// 	return nil
// }