package repo

import (
	"testing"

	opent "github.com/tidbcloud/devops/entity/operation"
	opmod "github.com/tidbcloud/devops/models/operation"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

func TestInstanceParamsLikeBuildsSQL(t *testing.T) {
	db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{DryRun: true})
	if err != nil {
		t.Fatalf("open dry-run db: %v", err)
	}

	query := db.Model(&opmod.OperationInstance{})
	query = InstanceOpts.ParamsLike(map[opent.ParamName]string{
		opent.ParamCloudConfigClusterType: "SHARED_POOL",
		opent.ParamNgModifyImageComponent: "tikv",
	}).Apply(query)

	stmt := query.Find(&[]opmod.OperationInstance{}).Statement
	if stmt.SQL.String() == "" {
		t.Fatalf("expected generated SQL")
	}

	for _, want := range []string{
		`%"cluster_type": "SHARED_POOL"%`,
		`%"component": "tikv"%`,
	} {
		if !containsSQLVar(stmt.Vars, want) {
			t.Fatalf("SQL vars = %#v, want %q", stmt.Vars, want)
		}
	}
}

func containsSQLVar(vars []any, want string) bool {
	for _, got := range vars {
		if got == want {
			return true
		}
	}
	return false
}
