package run

import (
	"context"

	runstore "github.com/tidbcloud/AgentTeam/internal/store/workflow/run"
	"github.com/tidbcloud/AgentTeam/internal/workflow/runmanage"
)

type fakeService struct {
	run            runstore.Run
	runPage        RunPage
	activationPage ActivationPage
	effectPage     EffectPage
	eventPage      EventPage
	event          runstore.Event
	cancelResult   CancelResult
	err            error

	listRunsInput   *ListRunsInput
	getWorkspaceID  string
	getRunID        string
	activationInput *ListChildrenInput
	effectInput     *ListChildrenInput
	eventInput      *ListEventsInput
	artifactInput   *ArtifactReadInput
	cancelInput     *CancelInput
}

func (fake *fakeService) ListRuns(_ context.Context, input runmanage.ListRunsInput) (runmanage.RunPage, error) {
	fake.listRunsInput = &input
	return fake.runPage, fake.err
}

func (fake *fakeService) GetRun(_ context.Context, workspaceID, runID string) (runstore.Run, error) {
	fake.getWorkspaceID, fake.getRunID = workspaceID, runID
	return fake.run, fake.err
}

func (fake *fakeService) ListActivations(_ context.Context, input runmanage.ListChildrenInput) (runmanage.ActivationPage, error) {
	fake.activationInput = &input
	return fake.activationPage, fake.err
}

func (fake *fakeService) ListEffects(_ context.Context, input runmanage.ListChildrenInput) (runmanage.EffectPage, error) {
	fake.effectInput = &input
	return fake.effectPage, fake.err
}

func (fake *fakeService) ListEffectQueueContexts(_ context.Context, _ string, _ string) (map[string]runstore.EffectQueueContext, error) {
	return map[string]runstore.EffectQueueContext{}, nil
}

func (fake *fakeService) ListEvents(_ context.Context, input runmanage.ListEventsInput) (runmanage.EventPage, error) {
	fake.eventInput = &input
	return fake.eventPage, fake.err
}

func (fake *fakeService) GetEvent(_ context.Context, _, _ string, _ int64) (runstore.Event, error) {
	return fake.event, fake.err
}

func (fake *fakeService) ReadArtifactPage(_ context.Context, input runmanage.ArtifactReadInput) (runmanage.ArtifactPage, error) {
	fake.artifactInput = &input
	return runmanage.ArtifactPage{Reference: input.Reference, Section: input.Section, Path: input.Path, Bytes: []byte(`{}`)}, nil
}

func (fake *fakeService) Cancel(_ context.Context, input runmanage.CancelInput) (runmanage.CancelResult, error) {
	fake.cancelInput = &input
	return fake.cancelResult, fake.err
}
