package exec

import (
	"context"

	"github.com/tidbcloud/AgentTeam/desktop/internal/wire/apiclient"
)

// agentRuntime forwards Agent mutations to the Agent Runtime API. It mirrors
// the team forwarding pattern; list/get stay local via AgentReader.
type agentRuntime interface {
	lifecycle(ctx context.Context, action string, input agentLifecycleRequest) (agentLifecycleResponse, error)
	create(ctx context.Context, input agentCreateRequest) (agentStructuralResponse, error)
	update(ctx context.Context, input agentUpdateRequest) (agentStructuralResponse, error)
	delete(ctx context.Context, input agentDeleteRequest) (agentStructuralResponse, error)
	duplicate(ctx context.Context, input agentDuplicateRequest) (agentStructuralResponse, error)
}

type agentRemote struct {
	client  *apiclient.Client
	receipt requestReceiptTransport
}

func (remote agentRemote) receiptTransport() requestReceiptTransport {
	transport := remote.receipt
	transport.client = remote.client
	return transport
}

func (remote agentRemote) lifecycle(ctx context.Context, action string, input agentLifecycleRequest) (agentLifecycleResponse, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return agentLifecycleResponse{}, err
	}
	var result agentLifecycleResponse
	err := remote.receiptTransport().post(ctx, remote.client.AgentRuntimePath("/managed-agents/"+action), input, &result, replayHeaders(input.RequestID))
	return result, err
}

func (remote agentRemote) create(ctx context.Context, input agentCreateRequest) (agentStructuralResponse, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return agentStructuralResponse{}, err
	}
	var result agentStructuralResponse
	err := remote.receiptTransport().post(ctx, remote.client.AgentRuntimePath("/managed-agents/create"), input, &result, replayHeaders(input.RequestID))
	return result, err
}

func (remote agentRemote) update(ctx context.Context, input agentUpdateRequest) (agentStructuralResponse, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return agentStructuralResponse{}, err
	}
	var result agentStructuralResponse
	err := remote.receiptTransport().post(ctx, remote.client.AgentRuntimePath("/managed-agents/update"), input, &result, replayHeaders(input.RequestID))
	return result, err
}

func (remote agentRemote) delete(ctx context.Context, input agentDeleteRequest) (agentStructuralResponse, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return agentStructuralResponse{}, err
	}
	var result agentStructuralResponse
	err := remote.receiptTransport().post(ctx, remote.client.AgentRuntimePath("/managed-agents/delete"), input, &result, replayHeaders(input.RequestID))
	return result, err
}

func (remote agentRemote) duplicate(ctx context.Context, input agentDuplicateRequest) (agentStructuralResponse, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return agentStructuralResponse{}, err
	}
	var result agentStructuralResponse
	err := remote.receiptTransport().post(ctx, remote.client.AgentRuntimePath("/managed-agents/duplicate"), input, &result, replayHeaders(input.RequestID))
	return result, err
}
