package converter

import (
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/service/appruntime"
	"github.com/tidbcloud/AgentTeam/internal/store/app"
)

// --- App runner management ---

func ToAppRunnerCredentialResponse(v app.AppRunnerCredentialView) dto.AppRunnerCredentialResponse {
	return dto.AppRunnerCredentialResponse{
		ID:                    v.ID,
		WorkspaceID:           v.WorkspaceID,
		ServiceDefinitionID:   v.ServiceDefinitionID,
		ServiceInstallationID: v.ServiceInstallationID,
		ServiceMemberID:       v.ServiceMemberID,
		CredentialKind:        v.CredentialKind,
		TransportKind:         v.TransportKind,
		Name:                  v.Name,
		TokenHint:             v.TokenHint,
		Status:                v.Status,
		CreatedByMemberID:     v.CreatedByMemberID,
		Metadata:              v.Metadata,
		CreatedAt:             v.CreatedAt,
		UpdatedAt:             v.UpdatedAt,
		LastUsedAt:            v.LastUsedAt,
		DisabledAt:            v.DisabledAt,
		ExpiresAt:             v.ExpiresAt,
	}
}

func ToAppRunnerCredentialTokenResponse(v app.AppRunnerCredentialTokenView) dto.AppRunnerCredentialTokenResponse {
	return dto.AppRunnerCredentialTokenResponse{
		Credential: ToAppRunnerCredentialResponse(v.Credential),
		Token:      v.Token,
	}
}

func ToAppCallbackSecretResponse(v app.AppCallbackSecretView) dto.AppCallbackSecretResponse {
	return dto.AppCallbackSecretResponse{
		AppID:                 v.AppID,
		AppSlug:               v.AppSlug,
		CallbackSigningSecret: v.CallbackSigningSecret,
	}
}

func ToAppRunnerCredentialResponses(items []app.AppRunnerCredentialView) []dto.AppRunnerCredentialResponse {
	if items == nil {
		return nil
	}
	out := make([]dto.AppRunnerCredentialResponse, 0, len(items))
	for _, item := range items {
		out = append(out, ToAppRunnerCredentialResponse(item))
	}
	return out
}

func ToAppInitialCredentialsStatusResponse(v app.AppInitialCredentialsStatusView) dto.AppInitialCredentialsStatusResponse {
	return dto.AppInitialCredentialsStatusResponse{Status: v.Status}
}

func ToAppInitialCredentialsClaimResponse(v app.AppInitialCredentialsClaimResult) dto.AppInitialCredentialsClaimResponse {
	return dto.AppInitialCredentialsClaimResponse{
		CallbackSigningSecret: v.CallbackSigningSecret,
		RunnerToken:           v.RunnerToken,
	}
}

func ToAppRunnerSessionResponse(v appruntime.RunnerSessionView) dto.AppRunnerSessionResponse {
	return dto.AppRunnerSessionResponse{
		ID:                         v.ID,
		WorkspaceID:                v.WorkspaceID,
		ServiceDefinitionID:        v.ServiceDefinitionID,
		ServiceInstallationID:      v.ServiceInstallationID,
		ServiceMemberID:            v.ServiceMemberID,
		ServiceRuntimeCredentialID: v.ServiceRuntimeCredentialID,
		RunnerID:                   v.RunnerID,
		RunnerVersion:              v.RunnerVersion,
		Status:                     v.Status,
		Capabilities:               v.Capabilities,
		Metadata:                   v.Metadata,
		LastHeartbeatAt:            v.LastHeartbeatAt,
		LastClaimAt:                v.LastClaimAt,
		CreatedAt:                  v.CreatedAt,
		UpdatedAt:                  v.UpdatedAt,
	}
}

func ToAppRunnerDeliveryEnvelopeResponse(v appruntime.RunnerDeliveryEnvelopeView) dto.AppRunnerDeliveryEnvelopeResponse {
	return dto.AppRunnerDeliveryEnvelopeResponse{
		EnvelopeID:    v.EnvelopeID,
		DeliveryID:    v.Delivery.ID,
		AttemptID:     v.Attempt.ID,
		EventType:     v.EventType,
		EventAction:   v.EventAction,
		Payload:       append([]byte(nil), v.EventPayload...),
		DeliveryToken: v.DeliveryToken,
		IssuedAt:      v.CreatedAt,
	}
}

func ToAppRunnerDeliveryEnvelopeResponses(items []appruntime.RunnerDeliveryEnvelopeView) []dto.AppRunnerDeliveryEnvelopeResponse {
	if items == nil {
		return nil
	}
	out := make([]dto.AppRunnerDeliveryEnvelopeResponse, 0, len(items))
	for _, item := range items {
		out = append(out, ToAppRunnerDeliveryEnvelopeResponse(item))
	}
	return out
}

func ToAppRunnerClaimResponse(v appruntime.RunnerClaimResult) dto.AppRunnerClaimResponse {
	return dto.AppRunnerClaimResponse{
		Session:   ToAppRunnerSessionResponse(v.Session),
		Envelopes: ToAppRunnerDeliveryEnvelopeResponses(v.Envelopes),
	}
}

func ToAppRuntimeReplyResponse(v app.AppRuntimeReplyResult) dto.AppRuntimeReplyResponse {
	return dto.AppRuntimeReplyResponse{
		DeliveryID:     v.Delivery.ID,
		AttemptID:      v.Attempt.ID,
		DeliveryStatus: v.Delivery.Status,
		AttemptStatus:  v.Attempt.Status,
		EffectID:       v.Effect.ID,
		EffectKind:     v.Effect.EffectKind,
		EffectRef:      v.Effect.EffectRef,
		MessageID:      v.MessageID,
	}
}

func ToAppRuntimeDeliveryActionResponse(v app.AppRuntimeDeliveryActionResult) dto.AppRuntimeDeliveryActionResponse {
	return dto.AppRuntimeDeliveryActionResponse{
		DeliveryID:     v.Delivery.ID,
		AttemptID:      v.Attempt.ID,
		DeliveryStatus: v.Delivery.Status,
		AttemptStatus:  v.Attempt.Status,
		ErrorCode:      v.Delivery.ErrorCode,
		ErrorDetail:    v.Delivery.ErrorDetail,
	}
}
