package mongo

import "testing"

func TestResolveExpectedCommitDeltas(t *testing.T) {
	tests := []struct {
		name            string
		expectedCommits int
		pinnedDeltas    int
		completedCount  int64
		deltaCount      int64
		want            int64
	}{
		{
			name:            "pinned target",
			expectedCommits: 581,
			pinnedDeltas:    568,
			completedCount:  580,
			deltaCount:      568,
			want:            568,
		},
		{
			name:            "skipped tail heuristic",
			expectedCommits: 581,
			completedCount:  580,
			deltaCount:      568,
			want:            568,
		},
		{
			name:            "in-flight uses expected commits",
			expectedCommits: 581,
			completedCount:  200,
			deltaCount:      190,
			want:            581,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := resolveExpectedCommitDeltas(tt.expectedCommits, tt.pinnedDeltas, tt.completedCount, tt.deltaCount)
			if got != tt.want {
				t.Fatalf("resolveExpectedCommitDeltas() = %d, want %d", got, tt.want)
			}
		})
	}
}

func TestCommitIntelStageStatus(t *testing.T) {
	tests := []struct {
		name            string
		expectedCommits int
		pinnedDeltas    int
		completedCount  int64
		deltaCount      int64
		analysisCount   int64
		want            string
	}{
		{
			name:            "completed when analyses match delta target",
			expectedCommits: 581,
			completedCount:  580,
			deltaCount:      568,
			analysisCount:   568,
			want:            "completed",
		},
		{
			name:            "running while fan-in incomplete",
			expectedCommits: 581,
			completedCount:  200,
			deltaCount:      190,
			analysisCount:   190,
			want:            "",
		},
		{
			name:            "running on first analysis",
			expectedCommits: 581,
			completedCount:  1,
			deltaCount:      1,
			analysisCount:   1,
			want:            "running",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := commitIntelStageStatus(
				tt.analysisCount,
				tt.deltaCount,
				tt.completedCount,
				tt.expectedCommits,
				tt.pinnedDeltas,
			)
			if got != tt.want {
				t.Fatalf("commitIntelStageStatus() = %q, want %q", got, tt.want)
			}
		})
	}
}
