package converter

import (
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/service/resource/activity"
)

func ToResourceActivityListResponse(page activity.ResourceActivityPage) dto.ResourceActivityListResponse {
	items := make([]dto.ResourceActivityItem, 0, len(page.Items))
	for _, item := range page.Items {
		items = append(items, ToResourceActivityItem(item))
	}
	return dto.ResourceActivityListResponse{Items: items, NextCursor: page.NextCursor}
}

func ToResourceActivityItem(item activity.ResourceActivityItem) dto.ResourceActivityItem {
	return dto.ResourceActivityItem{
		ID:           item.ID,
		WorkspaceID:  item.WorkspaceID,
		AssetType:    item.AssetType,
		AssetID:      item.AssetID,
		AssetName:    item.AssetName,
		RepoFullName: item.RepoFullName,
		EventType:    item.EventType,
		Actor: dto.ResourceActivityActor{
			Type: item.Actor.Type,
			ID:   item.Actor.ID,
			Name: item.Actor.Name,
		},
		SummaryKey: item.SummaryKey,
		Details:    item.Details,
		Display:    ToResourceActivityDisplay(item.Display),
		Target: dto.ResourceActivityTarget{
			Kind: item.Target.Kind,
			ID:   item.Target.ID,
			URL:  item.Target.URL,
		},
		Source:        item.Source,
		SourceEventID: item.SourceEventID,
		OccurredAt:    item.OccurredAt.UTC().Format(timeLayout),
	}
}

func ToResourceActivityDisplay(display activity.ResourceActivityDisplay) dto.ResourceActivityDisplay {
	meta := make([]dto.ResourceActivityDisplayMeta, 0, len(display.Meta))
	for _, item := range display.Meta {
		meta = append(meta, dto.ResourceActivityDisplayMeta{
			Key:         item.Key,
			Label:       item.Label,
			Value:       item.Value,
			Href:        item.Href,
			ExternalURL: item.ExternalURL,
			Title:       item.Title,
		})
	}
	return dto.ResourceActivityDisplay{
		Actor: dto.ResourceActivityDisplayActor{
			Kind:  display.Actor.Kind,
			ID:    display.Actor.ID,
			Name:  display.Actor.Name,
			Email: display.Actor.Email,
			Login: display.Actor.Login,
		},
		Resource: dto.ResourceActivityDisplayResource{
			Type:         display.Resource.Type,
			ID:           display.Resource.ID,
			Name:         display.Resource.Name,
			RepoRole:     repositoryRoleForWire(display.Resource.RepoRole),
			RepoFullName: display.Resource.RepoFullName,
			Href:         display.Resource.Href,
		},
		Target: dto.ResourceActivityDisplayTarget{
			Kind:        display.Target.Kind,
			ID:          display.Target.ID,
			Label:       display.Target.Label,
			Href:        display.Target.Href,
			ExternalURL: display.Target.ExternalURL,
		},
		Meta: meta,
	}
}
