//nolint:unused // skip for unstable test, for readability.
package worker

import (
	"context"
	"database/sql"
	"fmt"

	"github.com/pingcap/errors"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

const (
	rootUser  = "root"
	adminUser = "cloud_admin"
)

type worker interface {
	name() string
	triggerJob(context.Context) error
	verifyJob(context.Context) error
}

type workerContext struct {
	ctx     context.Context
	db      *sql.DB
	adminDB *sql.DB

	keyspaceName string
}

//
// var _ = ginkgo.Describe("TiDB-Worker", func() {
//	f := framework.New()
//
//	framework.It(labels.With(
//		labels.TCluster,
//		labels.Feature("tidbpool"),
//	), "check tidb worker normally", func() {
//		ctx := context.Background()
//
//		ginkgo.By("create a cluster")
//		cluster := helper.Create(ctx, f, helper.TypeCluster, true, "")
//		clusterStatus, err := cloudv1.AwsFreeTierClusterStatusFromCluster(cluster)
//		gomega.Expect(err).Should(gomega.Succeed())
//
//		keyspaceName := clusterStatus.KeyspaceToken
//
//		f.Logger.Info("start to test tidb worker", "keyspace name", keyspaceName)
//
//		ginkgo.By("connect to user tidb")
//		db, err := endpointConnectedDB(ctx, keyspaceName, rootUser, *cluster.Status.SqlEndpoints.PublicEndpoint)
//		gomega.Expect(err).Should(gomega.Succeed(), "failed to connect db")
//
//		adminDB, err := endpointConnectedDB(ctx, keyspaceName, adminUser, *cluster.Status.SqlEndpoints.PublicEndpoint)
//		gomega.Expect(err).Should(gomega.Succeed(), "failed to connect db")
//
//		wctx := &workerContext{
//			ctx:     ctx,
//			db:      db,
//			adminDB: adminDB,
//
//			keyspaceName: clusterStatus.KeyspaceToken,
//		}
//
//		workers := []worker{
//			newBgtaskWorker(f, wctx),
//			newGCV2Worker(f, wctx),
//			newTTLWorker(f, wctx),
//
//			// newAnalyzeWorker(f, wctx),
//			// newRemoteQueryWorker(f, wctx),
//		}
//
//		for _, w := range workers {
//			gomega.Expect(w.triggerJob(ctx)).Should(gomega.Succeed(),
//				fmt.Sprintf("failed to trigger %s job", w.name()))
//		}
//
//		wg := sync.WaitGroup{}
//		for _, w := range workers {
//			wg.Add(1)
//			w0 := w
//			go func() {
//				defer wg.Done()
//				defer ginkgo.GinkgoRecover()
//				gomega.Expect(w0.verifyJob(ctx)).Should(gomega.Succeed(),
//					fmt.Sprintf("failed to verify %s job", w0.name()))
//			}()
//		}
//		wg.Wait()
//	})
// })

func endpointConnectedDB(
	ctx context.Context,
	keyspaceToken, userName string,
	endpoint cloudv1.SqlEndpointStatus,
) (*sql.DB, error) {
	dsn := DSN(keyspaceToken, userName, endpoint)
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		return nil, errors.Annotatef(err, "failed to open db %q", dsn)
	}

	row := db.QueryRowContext(ctx, "select 1")
	if row.Err() != nil {
		return nil, errors.Annotatef(row.Err(), "failed to run query")
	}

	return db, nil
}

func DSN(keyspaceToken, userName string, endpoint cloudv1.SqlEndpointStatus) string {
	return fmt.Sprintf("%s.%s@tcp(%s:%d)/?tls=preferred", keyspaceToken, userName, endpoint.Host, endpoint.Port)
}
