package automation

import (
	"context"

	"github.com/tidbcloud/AgentTeam/internal/automation/dsl"
	automationservice "github.com/tidbcloud/AgentTeam/internal/service/automation"
	automationstore "github.com/tidbcloud/AgentTeam/internal/store/automation"
)

// Service is the automations business-service port consumed by API handlers.
type Service interface {
	StartRepositoryAutomationRun(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryRunMutation) (automationstore.AutomationRun, error)
	StartRepositoryAutomationRunsForPushEvent(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryPushEventMutation) ([]automationstore.AutomationRun, error)
	ListAutomationRepositories(ctx context.Context, workspaceID string, subject string, authorizationHeader string, page int, perPage int) ([]automationservice.AutomationSourceRepository, error)
	ListRepositoryAutomationFiles(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationQuery) ([]automationservice.AutomationSourceFile, error)
	GetRepositoryAutomationFile(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationQuery) (automationservice.AutomationSourceContent, error)
	SaveRepositoryAutomationFile(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationSaveMutation) (automationservice.AutomationSourceWriteResult, error)
	DeleteRepositoryAutomationFile(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationDeleteMutation) error
	ValidateRepositoryAutomationContent(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationValidateMutation) (dsl.ValidationReport, error)
	PreflightRepositoryAutomation(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationPreflightMutation) (automationservice.AutomationPreflightReport, error)
	GetRepositoryAutomationRunnerReadiness(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRepositoryAutomationQuery) (automationservice.AutomationRunnerReadiness, error)
	ListAutomationSecrets(ctx context.Context, workspaceID string, subject string, owner string, repo string, page int, perPage int) (automationservice.ListAutomationSecretsResult, error)
	UpsertAutomationSecret(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationSecretMutation) (automationservice.AutomationSecretMetadata, error)
	DeleteAutomationSecret(ctx context.Context, workspaceID string, subject string, owner string, repo string, name string) error
	ListAutomationRuns(ctx context.Context, workspaceID string, subject string, status string, repositoryFullName string, query string, page int, perPage int) (automationstore.ListRunsResult, error)
	GetAutomationDashboard(ctx context.Context, workspaceID string, subject string) (automationservice.AutomationDashboard, error)
	GetAutomationRun(ctx context.Context, workspaceID string, subject string, runID string) (automationstore.AutomationRun, error)
	GetAutomationRunOverview(ctx context.Context, workspaceID string, subject string, runID string) (automationservice.AutomationRunOverview, error)
	ListAutomationJobRuns(ctx context.Context, workspaceID string, subject string, runID string) ([]automationstore.AutomationJobRun, error)
	ListAutomationEvents(ctx context.Context, workspaceID string, subject string, runID string, page int, perPage int) ([]automationstore.AutomationEvent, error)
	ListAutomationLogChunks(ctx context.Context, workspaceID string, subject string, runID string, jobRunID string, stream string, page int, perPage int) ([]automationstore.AutomationLogChunk, error)
	ReadAutomationLogChunkContent(ctx context.Context, workspaceID string, subject string, runID string, jobRunID string, stream string, sequence int64) (automationservice.AutomationLogChunkContent, error)
	ListAutomationArtifacts(ctx context.Context, workspaceID string, subject string, runID string, jobRunID string, page int, perPage int) ([]automationstore.AutomationArtifact, error)
	ReadAutomationArtifactContent(ctx context.Context, workspaceID string, subject string, runID string, artifactID string) (automationservice.AutomationArtifactContent, error)
	ListAutomationWaits(ctx context.Context, workspaceID string, subject string, runID string, status string) ([]automationstore.AutomationWait, error)
	ResumeAutomationWait(ctx context.Context, workspaceID string, subject string, runID string, waitID string, resultJSON string) (automationstore.AutomationWait, error)
	CompleteAutomationTaskWait(ctx context.Context, workspaceID string, subject string, runID string, waitID string, input automationservice.AutomationWaitTaskCompleteMutation) (automationstore.AutomationWait, error)
	SignalAutomationEventWait(ctx context.Context, workspaceID string, subject string, runID string, waitID string, input automationservice.AutomationWaitEventSignalMutation) (automationstore.AutomationWait, error)
	DeliverAutomationWaitSignal(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationWaitSignalMutation) (automationstore.AutomationWait, error)
	CancelAutomationRun(ctx context.Context, workspaceID string, subject string, runID string, reason string) (automationstore.AutomationRun, error)
	RetryAutomationRun(ctx context.Context, workspaceID string, subject string, runID string, authorizationHeader string) (automationstore.AutomationRun, error)
	RegisterAutomationRunner(ctx context.Context, workspaceID string, subject string, input automationservice.AutomationRunnerRegisterMutation) (automationservice.AutomationRunnerRegistration, error)
	CreateAutomationRunnerSession(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerSessionMutation) (automationservice.AutomationRunnerSession, error)
	HeartbeatAutomationRunnerSession(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerHeartbeatMutation) (automationservice.AutomationRunnerHeartbeat, error)
	AcquireAutomationRunnerJobs(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerAcquireMutation) ([]automationservice.AutomationRunnerJob, error)
	AcceptAutomationRunnerJob(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerJobMutation) (automationstore.AutomationJobRun, error)
	CompleteAutomationRunnerJob(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerJobMutation) (automationstore.AutomationJobRun, error)
	FailAutomationRunnerJob(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerJobMutation) (automationstore.AutomationJobRun, error)
	RenewAutomationRunnerJob(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerJobRenewMutation) (automationservice.AutomationRunnerJobLease, error)
	AppendAutomationRunnerJobLog(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerJobMutation) (automationstore.AutomationEvent, error)
	AppendAutomationRunnerJobArtifact(ctx context.Context, workspaceID string, runnerToken string, input automationservice.AutomationRunnerJobMutation) (automationstore.AutomationEvent, error)
	PinAutomationRepo(ctx context.Context, workspaceID string, subject string, owner string, repo string) (automationstore.AutomationPinnedRepo, error)
	UnpinAutomationRepo(ctx context.Context, workspaceID string, subject string, owner string, repo string) error
	ListPinnedAutomationRepos(ctx context.Context, workspaceID string, subject string, page int, perPage int) ([]automationstore.AutomationPinnedRepo, error)
}
