package provider

import (
	"context"
	"fmt"
	"log/slog"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/store/app"
)

const providerRequestProjectionTimeout = 10 * time.Second

// projectPendingGitHubConnectionRequest mirrors the App request endpoint's
// after-commit contract: the request row is authoritative, and notification
// projection is best effort. A delivery failure is observable but must not
// make the provider callback claim that the durable request rolled back.
func (handler *GitHubHandler) projectPendingGitHubConnectionRequest(
	parent context.Context,
	request app.AppInstallationRequestView,
) {
	if handler.installationRequestProjector == nil {
		handler.logProviderRequestProjectionFailure(request, fmt.Errorf("projector is not configured"))
		return
	}
	ctx, cancel := context.WithTimeout(context.WithoutCancel(parent), providerRequestProjectionTimeout)
	defer cancel()
	if _, err := handler.installationRequestProjector.ProjectPendingAppInstallationRequest(ctx, request); err != nil {
		handler.logProviderRequestProjectionFailure(request, err)
	}
}

func (handler *GitHubHandler) logProviderRequestProjectionFailure(
	request app.AppInstallationRequestView,
	err error,
) {
	if handler.logger == nil {
		return
	}
	handler.logger.Error(
		"failed to project committed provider App installation request",
		slog.String("workspaceID", request.WorkspaceID),
		slog.String("requestID", request.ID),
		slog.String("appID", request.AppID),
		slog.String("requestKind", request.RequestKind),
		slog.Any("error", err),
	)
}
