package kb

import (
	"sort"
	"strings"

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

func overviewActivities(events []kb.AuditEvent, jobs []kb.Job, limit int) []KBOverviewActivity {
	out := make([]KBOverviewActivity, 0, len(events)+len(jobs))
	for _, event := range events {
		out = append(out, KBOverviewActivity{
			ID:           event.ID,
			Kind:         "audit",
			ActorID:      event.ActorID,
			Action:       event.Action,
			ResourceType: event.ResourceType,
			ResourceID:   event.ResourceID,
			Status:       "recorded",
			Summary:      event.Summary,
			CreatedAt:    event.CreatedAt,
		})
	}
	for _, job := range jobs {
		activity, ok := overviewActivityFromJob(job)
		if ok {
			out = append(out, activity)
		}
	}
	sort.SliceStable(out, func(i, j int) bool {
		if !out[i].CreatedAt.Equal(out[j].CreatedAt) {
			return out[i].CreatedAt.After(out[j].CreatedAt)
		}
		return out[i].ID > out[j].ID
	})
	if limit > 0 && len(out) > limit {
		return out[:limit]
	}
	return out
}

func overviewActivityFromJob(job kb.Job) (KBOverviewActivity, bool) {
	action := overviewJobAction(job)
	if action == "" {
		return KBOverviewActivity{}, false
	}
	return KBOverviewActivity{
		ID:           job.ID,
		Kind:         "job",
		Action:       action,
		ResourceType: "source",
		ResourceID:   job.SourceID,
		Status:       job.Status,
		Summary:      overviewJobSummary(job),
		CreatedAt:    firstTime(job.UpdatedAt, job.CreatedAt),
	}, true
}

func overviewJobAction(job kb.Job) string {
	var prefix string
	switch strings.TrimSpace(job.JobType) {
	case KBJobTypeSyncSourceMirror:
		prefix = "kb.source.mirror_sync"
	default:
		return ""
	}
	switch strings.TrimSpace(job.Status) {
	case KBJobStatusQueued:
		return prefix + ".queued"
	case KBJobStatusRunning:
		return prefix + ".running"
	case KBJobStatusSucceeded:
		return prefix + ".succeeded"
	case KBJobStatusFailed:
		return prefix + ".failed"
	default:
		return prefix
	}
}

func overviewJobSummary(job kb.Job) string {
	if strings.TrimSpace(job.Status) != KBJobStatusFailed {
		return ""
	}
	display := KBJobDisplayProgressForJob(job)
	return SanitizeKBProgressMessage(firstNonEmptyString(job.Error, display.Message))
}
