package invocation

import (
	"encoding/json"

	"github.com/tidbcloud/AgentTeam/internal/api/dto"
)

func invocationResponse(value Invocation, runStatus string, replayed bool) dto.WorkflowInvocationResponse {
	response := dto.WorkflowInvocationResponse{
		ID:        value.ID,
		BindingID: value.BindingID, BindingSourceID: value.BindingSourceID,
		BindingActivation: value.BindingActivation, PlanID: value.PlanID,
		PlanVersion: dto.WorkflowInvocationVersionRefResponse{
			ID: value.PlanVersionID,
		},
		Source: dto.WorkflowInvocationSourceResponse{
			Kind: value.SourceKind, OccurrenceRef: value.SourceOccurrenceRef,
			OccurredAt: value.SourceOccurredAt, Provenance: nonNilJSON(value.SourceProvenanceJSON),
		},
		Input:       nonNilJSON(value.InputJSON),
		InputDigest: value.InputDigest,
		ExecutionOwner: dto.WorkflowInvocationExecutionOwnerResponse{
			UserID: value.Identity.OwnerUserID, MemberID: value.Identity.OwnerMemberID,
		},
		PrincipalMemberID: value.Identity.PrincipalMemberID,
		AuthorMemberID:    value.Identity.AuthorMemberID,
		RunID:             value.RunID,
		RunStatus:         runStatus,
		AcceptedAt:        value.AcceptedAt,
		Replayed:          replayed,
	}
	if value.BindingRevisionID != "" {
		response.BindingRevision = &dto.WorkflowInvocationRevisionRefResponse{
			ID: value.BindingRevisionID, Revision: value.BindingRevision,
		}
	}
	if value.InvokedBy.Type != "" || value.InvokedBy.ID != "" || value.InvokedBy.MemberID != "" {
		response.InvokedBy = &dto.WorkflowInvocationActorResponse{
			Type: value.InvokedBy.Type, ID: value.InvokedBy.ID, MemberID: value.InvokedBy.MemberID,
		}
	}
	return response
}

func recordResponse(value Record) dto.WorkflowInvocationResponse {
	return invocationResponse(value.Invocation, value.Run.Status, false)
}

func listInvocationResponse(value Summary) dto.WorkflowInvocationResponse {
	response := invocationResponse(value.Invocation, value.RunStatus, false)
	response.Input = nil
	response.Source.Provenance = nil
	return response
}

func nonNilJSON(value json.RawMessage) json.RawMessage {
	if len(value) == 0 {
		return json.RawMessage(`{}`)
	}
	return value
}
