package converter

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/service/automation"
	"github.com/tidbcloud/AgentTeam/internal/service/automation/runtime"
	automationstore "github.com/tidbcloud/AgentTeam/internal/store/automation"
)

func TestToAutomationDashboardIncludesMetricsAndAttentionItems(t *testing.T) {
	observedAt := time.Date(2026, 6, 7, 10, 0, 0, 0, time.UTC)
	dto := ToAutomationDashboard(automation.AutomationDashboard{
		ObservedAt: observedAt,
		Health:     automation.AutomationDashboardHealth{Status: automation.AutomationDashboardHealthAttention, IssueCount: 1},
		Metrics: automation.AutomationDashboardMetrics{
			ObservedAt: observedAt,
			RunMetrics: automationstore.RunMetrics{
				ActiveSlots:       2,
				LeakedActiveSlots: 1,
			},
			WaitMetrics: automationstore.WaitMetrics{
				Active: 3,
			},
			RunnerMetrics: automationstore.RunnerMetrics{
				Registered:      4,
				ActiveSessions:  2,
				ExpiredSessions: 1,
			},
			BlobMetrics: automationstore.BlobMetrics{
				LogChunks:        5,
				Artifacts:        2,
				ExpiredArtifacts: 1,
			},
			Reconciler: runtime.ReconcilerStatus{
				LastStartedAt:       observedAt.Add(-time.Minute),
				LastSuccessAt:       observedAt,
				ConsecutiveFailures: 1,
			},
		},
		AttentionItems: []automation.AutomationDashboardAttentionItem{{Kind: "active_agent_tasks", Severity: automation.AutomationDashboardSeverityWarning, Count: 1, TargetPath: "/automations/dashboard"}},
	})

	require.Equal(t, observedAt.Format(time.RFC3339Nano), dto.ObservedAt)
	require.Equal(t, automation.AutomationDashboardHealthAttention, dto.Health.Status)
	require.EqualValues(t, 3, dto.Metrics.WaitMetrics.Active)
	require.EqualValues(t, 2, dto.Metrics.RunMetrics.ActiveSlots)
	require.EqualValues(t, 1, dto.Metrics.RunMetrics.LeakedActiveSlots)
	require.EqualValues(t, 4, dto.Metrics.RunnerMetrics.Registered)
	require.EqualValues(t, 2, dto.Metrics.RunnerMetrics.ActiveSessions)
	require.EqualValues(t, 1, dto.Metrics.RunnerMetrics.ExpiredSessions)
	require.EqualValues(t, 5, dto.Metrics.BlobMetrics.LogChunks)
	require.EqualValues(t, 1, dto.Metrics.BlobMetrics.ExpiredArtifacts)
	require.EqualValues(t, 1, dto.Metrics.Reconciler.ConsecutiveFailures)
	require.Equal(t, observedAt.Format(time.RFC3339Nano), dto.Metrics.Reconciler.LastSuccessAt)
	require.Len(t, dto.AttentionItems, 1)
	require.Equal(t, "active_agent_tasks", dto.AttentionItems[0].Kind)
}

func TestToAutomationSourceSaveResponse(t *testing.T) {
	dto := ToAutomationSourceSaveResponse(automation.AutomationSourceWriteResult{
		Content: automation.AutomationSourceSavedFile{
			AutomationSourceFile: automation.AutomationSourceFile{
				RepositoryOwner: "pingcap",
				RepositoryName:  "agentteam",
				Path:            ".agentteam/build.yml",
				Name:            "build.yml",
				SHA:             "content-sha",
				Size:            92,
				Ref:             "main",
			},
			Encoding: "utf-8",
		},
		Commit: automation.AutomationSourceCommit{SHA: "commit-sha", Message: "save automation"},
	})

	require.Equal(t, "pingcap", dto.Content.RepositoryOwner)
	require.Equal(t, "agentteam", dto.Content.RepositoryName)
	require.Equal(t, ".agentteam/build.yml", dto.Content.Path)
	require.Equal(t, "content-sha", dto.Content.SHA)
	require.EqualValues(t, 92, dto.Content.Size)
	require.Equal(t, "main", dto.Content.Ref)
	require.Equal(t, "utf-8", dto.Content.Encoding)
	require.Equal(t, "commit-sha", dto.Commit.SHA)
	require.Equal(t, "save automation", dto.Commit.Message)
}
