package replay

import (
	"context"

	"github.com/tidbcloud/dataflow-service/app/models/domain"
	"github.com/tidbcloud/pkgv2/bizerr"
)

// ReplayModel define the business operation interface for Replay task
type ReplayModel interface {
	// Create create a new Replay task
	Create(ctx context.Context, req *domain.CreateReplayReq) (*domain.CreateReplayResp, bizerr.BizError)
	// Get get the Replay task details
	Get(ctx context.Context, req *domain.GetReplayReq) (*domain.GetReplayResp, bizerr.BizError)
	// List list the Replay tasks
	List(ctx context.Context, req *domain.ListReplayReq) (*domain.ListReplayResp, bizerr.BizError)
	// Update Replay
	Update(ctx context.Context, req *domain.UpdateReplayReq) (*domain.UpdateReplayResp, bizerr.BizError)
	// Delete delete the Replay task
	Delete(ctx context.Context, req *domain.DeleteReplayReq) bizerr.BizError
	// Pause pause the Replay task
	Pause(ctx context.Context, req *domain.PauseReplayReq) bizerr.BizError
	// Resume resume the Replay task
	Resume(ctx context.Context, req *domain.ResumeReplayReq) bizerr.BizError
}

// ReplayWorker define the background worker interface for Replay task
type ReplayWorker interface {
	// SyncAllReplays sync all Replay task status, drive the status machine transition
	SyncAllReplays(ctx context.Context) bizerr.BizError
}

// ReplayOperator define the operation interface for interacting with the actual Replay resource
type ReplayOperator interface {
	// Deploy deploy the Replay resource
	Deploy(ctx context.Context, req *domain.DeployReplayReq) bizerr.BizError
	// Modify update the Replay resource
	Modify(ctx context.Context, req *domain.ModifyReplayReq) bizerr.BizError
	// Start start the Replay task
	Start(ctx context.Context, req *domain.StartReplayReq) bizerr.BizError
	// Stop stop the Replay task
	Stop(ctx context.Context, req *domain.StopReplayReq) bizerr.BizError
	// Destroy destroy the Replay resource
	Destroy(ctx context.Context, req *domain.DestroyReplayReq) bizerr.BizError
	// GetStatus get the Replay resource status
	GetStatus(ctx context.Context, req *domain.GetReplayStatusReq) (*domain.GetReplayStatusResp, bizerr.BizError)
}
