package activity

import (
	"context"
	"strings"
	"time"

	activitystore "github.com/tidbcloud/AgentTeam/internal/store/resource/activity"
	"github.com/tidbcloud/AgentTeam/internal/store/resource/repos"
)

const (
	ResourceRepositoryActivityCreated = "repo_created"
	ResourceRepositoryActivityDeleted = "repo_deleted"
)

// WriteResourceRepositoryLifecycleActivity records a supported repository
// lifecycle transition as an optional resource-domain activity side effect.
// Unsupported resources, events, or nil activity wiring are no-ops.
func WriteResourceRepositoryLifecycleActivity(ctx context.Context, store *activitystore.Store, repo repos.ResourceRepository, event string, actor string, occurredAt time.Time) error {
	if store == nil || strings.TrimSpace(repo.ResourceType) == repos.ResourceTypeAutomationRepository {
		return nil
	}
	assetType, ok := ResourceActivityAssetTypeForResourceType(repo.ResourceType)
	if !ok {
		return nil
	}
	event = normalizeRepositoryLifecycleActivityEvent(event)
	if event == "" {
		return nil
	}
	controlEvent := strings.TrimPrefix(event, "repo_")
	repoFullName := firstNonEmpty(repo.RepoFullName, repoFullName(repo.RepoOwner, repo.RepoName))
	return WriteResourceActivityEvent(ctx, store, ResourceActivityEventInput{
		WorkspaceID:  repo.WorkspaceID,
		AssetType:    assetType,
		AssetID:      repo.ResourceID,
		RepoFullName: repoFullName,
		EventType:    event,
		ActorType:    ActivityActorTypeUser,
		ActorID:      actor,
		SummaryKey:   event,
		Details: map[string]any{
			"repoRole":     strings.TrimSpace(repo.RepoRole),
			"repoOwner":    strings.TrimSpace(repo.RepoOwner),
			"repoName":     strings.TrimSpace(repo.RepoName),
			"repoFullName": repoFullName,
			"resourceType": strings.TrimSpace(repo.ResourceType),
			"resourceID":   strings.TrimSpace(repo.ResourceID),
		},
		TargetKind:    "repository",
		TargetID:      repoFullName,
		Source:        activitystore.SourceControl,
		SourceEventID: ResourceActivityControlSourceEventID(repo.ResourceType, repo.ResourceID, repo.RepoRole, controlEvent),
		OccurredAt:    occurredAt,
	})
}

func normalizeRepositoryLifecycleActivityEvent(event string) string {
	switch strings.TrimSpace(event) {
	case "created", ResourceRepositoryActivityCreated:
		return ResourceRepositoryActivityCreated
	case "deleted", ResourceRepositoryActivityDeleted:
		return ResourceRepositoryActivityDeleted
	default:
		return ""
	}
}
