package privatelinkservicemigration

import (
	"context"

	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
)

type Filter struct {
	OrganizationID    uint64
	ProjectID         uint64
	SourceClusterID   uint64
	TargetClusterID   uint64
	SourceTidbGroupID uint64
	TargetTidbGroupID uint64
}

type MigrationTidbGroupFilter struct {
	SourceTidbGroupIDs []uint64
	TargetTidbGroupIDs []uint64
	States             []globaldedicatedv1.PrivateLinkServiceMigration_State
}

type Repo interface {
	Create(ctx context.Context, migration *entity.PrivateLinkServiceMigration) (*entity.PrivateLinkServiceMigration, error)
	Save(ctx context.Context, migration *entity.PrivateLinkServiceMigration) (*entity.PrivateLinkServiceMigration, error)
	UpdateState(
		ctx context.Context,
		id uint64,
		state globaldedicatedv1.PrivateLinkServiceMigration_State,
		message string,
	) (*entity.PrivateLinkServiceMigration, error)
	Get(ctx context.Context, id uint64) (*entity.PrivateLinkServiceMigration, error)
	List(ctx context.Context, filter *Filter) ([]*entity.PrivateLinkServiceMigration, error)
	GetMigrationTidbGroup(ctx context.Context, migrationId uint64, sourceTidbGroupId, targetTidbGroupId uint64) (*entity.MigrationTidbGroup, error)
	UpdateMigrationTidbGroup(
		ctx context.Context,
		migrationId uint64,
		migrationTidbGroup *entity.MigrationTidbGroup,
	) (*entity.MigrationTidbGroup, error)
	ListMigrationTidbGroups(ctx context.Context, filter *MigrationTidbGroupFilter) ([]*entity.MigrationTidbGroup, error)
}
