package repo

import (
	"context"

	"github.com/tidbcloud/pov-service/internal/common/options"
	"github.com/tidbcloud/pov-service/internal/model"
)

// Tx represents a database transaction
type Tx interface {
	Commit() error
	Rollback() error
}

type WorkloadTest interface {
	Create(ctx context.Context, workload model.WorkloadTest) (model.WorkloadTest, error)
	Update(
		ctx context.Context,
		workload model.WorkloadTest,
		opts ...options.TableStatement,
	) (model.WorkloadTest, error)
	Get(ctx context.Context, ID string) (model.WorkloadTest, error)
	ListActive(ctx context.Context) ([]model.WorkloadTest, error)
	List(ctx context.Context, opts options.ListOption[options.WorkloadTestRefOption]) ([]model.WorkloadTest, error)

	// Transaction-based methods for holding locks across operations
	BeginTx(ctx context.Context) (Tx, error)
	GetAndLockForUpdateInTx(ctx context.Context, tx Tx, ID string, opts ...options.TableStatement) (model.WorkloadTest, error)
	UpdateInTx(ctx context.Context, tx Tx, workload model.WorkloadTest) error
	Count(ctx context.Context) (map[int64]int, error)
}

type WorkloadSample interface {
	BeginTx(ctx context.Context) (Tx, error)
	LockWorkloadSchemaInTx(ctx context.Context, tx Tx, workloadID int64) (model.DBSampleResult, error)
	CreateInTx(
		ctx context.Context,
		tx Tx,
		workloadID int64,
		dbs []model.DataBase) (int64, error)
	DeleteOutdatedInTx(
		ctx context.Context,
		tx Tx,
		workloadID int64,
		latestVersion int64) error
	SelectLatestSchema(
		ctx context.Context,
		workloadID int64) (model.DBSampleResult, error)
	SelectTable(
		ctx context.Context,
		workloadID int64,
		dbName,
		tableName string,
	) (model.Table, error)
}

type Script interface {
	ListTemplates(ctx context.Context) ([]model.ScriptTemplate, error)
	GetTemplate(ctx context.Context, id int64) (model.ScriptTemplate, error)
	CreateTemplate(ctx context.Context, tmpl model.ScriptTemplate) (model.ScriptTemplate, error)
	UpdateTemplate(ctx context.Context, tmpl model.ScriptTemplate) (model.ScriptTemplate, error)
	DeleteTemplate(ctx context.Context, id int64) error

	ListScripts(ctx context.Context, opts options.ListOption[options.ScriptOptions]) ([]model.Script, error)
	GetScript(ctx context.Context, id int64) (model.Script, error)
	CreateScript(ctx context.Context, script model.Script) (model.Script, error)
	UpdateScript(ctx context.Context, script model.Script) (model.Script, error)
	DeleteScript(ctx context.Context, id int64) error
}
