package service_test

import (
	"testing"
	"time"

	apicontract "bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/contracts/api"
	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/domain"
	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/service"
)

func TestListIndexedRepos(t *testing.T) {
	store := newMockMetadataStore()
	syncAt := time.Date(2026, 6, 17, 12, 0, 0, 0, time.UTC)
	completedAt := time.Date(2026, 6, 17, 13, 0, 0, 0, time.UTC)

	store.repositories["ad/ready-repo.com"] = domain.Repository{
		RepoID:     "ad/ready-repo.com",
		CloneURL:   "https://bit.admedia.com/scm/ad/ready-repo.com.git",
		LastSyncAt: syncAt,
		UpdatedAt:  syncAt,
	}
	store.repositories["ad/indexing-repo.com"] = domain.Repository{
		RepoID:     "ad/indexing-repo.com",
		CloneURL:   "https://bit.admedia.com/scm/ad/indexing-repo.com.git",
		LastSyncAt: syncAt,
		UpdatedAt:  syncAt.Add(-time.Hour),
	}

	store.indexingRuns["run_ready"] = domain.IndexingRun{
		IndexingRunID: "run_ready",
		RepoID:        "ad/ready-repo.com",
		Status:        domain.IndexingRunStatusCompleted,
		StartedAt:     syncAt,
		CompletedAt:   &completedAt,
		Stages: domain.IndexingRunStages{
			RepoSync:      domain.StageStatusCompleted,
			CodeParse:     domain.StageStatusCompleted,
			GraphFinalize: domain.StageStatusCompleted,
			Embedding:     domain.StageStatusCompleted,
		},
	}
	store.indexingRuns["run_indexing"] = domain.IndexingRun{
		IndexingRunID: "run_indexing",
		RepoID:        "ad/indexing-repo.com",
		Status:        domain.IndexingRunStatusRunning,
		StartedAt:     syncAt,
		Stages: domain.IndexingRunStages{
			RepoSync:  domain.StageStatusCompleted,
			CodeParse: domain.StageStatusRunning,
		},
	}

	svc := service.NewSyncService(nil, nil, store, nil)
	repos, err := svc.ListIndexedRepos("")
	if err != nil {
		t.Fatalf("ListIndexedRepos: %v", err)
	}
	if len(repos) != 2 {
		t.Fatalf("expected 2 repos, got %d", len(repos))
	}
	if repos[0].RepoID != "ad/ready-repo.com" {
		t.Fatalf("expected ready repo first, got %s", repos[0].RepoID)
	}
	if repos[0].Status != apicontract.IndexedRepoStatusReady {
		t.Fatalf("ready repo status: got %q", repos[0].Status)
	}
	if repos[1].Status != apicontract.IndexedRepoStatusIndexing {
		t.Fatalf("indexing repo status: got %q", repos[1].Status)
	}
}
