package qhad

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

	"github.com/pingcap/endless/pkg/client/tidb"
	. "github.com/pingcap/endless/pkg/matcher"
	"github.com/pingcap/endless/pkg/workloadnode/cmdstr"
	"github.com/pingcap/endless/testcase/oltp/oltppkg"
	"github.com/pingcap/endless/testcase/oltp/scenario/params"
	"github.com/pingcap/log"
	"github.com/pingcap/test-infra/sdk/resource"
)

func InitializeAddColumn001Params(ctx context.Context, tidbClient *tidb.Client) (*params.AddColumn, error) {
	params := params.AddColumn{
		RunTime:    1 * time.Hour,
		WarmUpTime: 1 * time.Minute,
	}
	return &params, nil
}

func AddGeneratedColumnForAllTablesRepeatedly(
	ctx context.Context,
	tc resource.TiDBCluster,
	opts cmdstr.QHAdOptions,
) error {
	// TODO: recover config after test, such as drop column for all tables which added column successfully.
	dbName := opts.DBName
	tables := oltppkg.GetAllTablesNames(ctx, tc, dbName)
	tableNum := len(tables)
	addColumnName := "GeneratedColumn"
	var columeName string
	db := Try(ConnectDbWithTimeout(tc, dbName)).(*sql.DB)
	defer db.Close()
	log.Info("start adding column for all tables Repeatedly")
	for {
		select {
		case <-ctx.Done():
			log.Info("and column ctx done.")
			return nil
		default:
		}
		for i := 0; i < tableNum; i++ {
			tableName := tables[i]
			query := fmt.Sprintf("select column_name from information_schema.columns where table_schema='%s' and table_name='%s' and column_name='%s';", dbName, tableName, addColumnName)
			dropColumn := fmt.Sprintf("alter table %s drop column %s;", tableName, addColumnName)
			addColumn := fmt.Sprintf("alter table %s add column %s date as (adddate(create_date, 31)) %s;", tableName, addColumnName, "virtual")
			if DbQueryRowWithLog(db, query).Scan(&columeName) == nil {
				Try(DbExecWithIgnoreCtxDeadline(ctx, db, dropColumn))
			}
			Try(DbExecWithIgnoreCtxDeadline(ctx, db, addColumn))
			Try(DbExecWithIgnoreCtxDeadline(ctx, db, dropColumn))
		}
	}
}
