package service_test

import (
	"context"
	"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 TestListIndexedReposByOrgExcludesLegacyAndUnlinked(t *testing.T) {
	store := newMockMetadataStore()
	ctx := context.Background()
	syncAt := time.Date(2026, 6, 17, 12, 0, 0, 0, time.UTC)

	store.repositories["ad/legacy-repo.com"] = domain.Repository{
		RepoID:    "ad/legacy-repo.com",
		CloneURL:  "https://bit.admedia.com/scm/ad/legacy-repo.com.git",
		UpdatedAt: syncAt,
	}
	store.repositories["github:org/shared-repo"] = domain.Repository{
		RepoID:    "github:org/shared-repo",
		CloneURL:  "https://github.com/org/shared-repo.git",
		UpdatedAt: syncAt,
	}

	_ = store.UpsertOrgRepositoryLink(ctx, domain.OrgRepositoryLink{
		OrgID:  "org-a",
		RepoID: "github:org/shared-repo",
	})
	_ = store.UpsertOrgRepositoryLink(ctx, domain.OrgRepositoryLink{
		OrgID:  "org-b",
		RepoID: "github:org/shared-repo",
	})
	_ = store.UpsertOrgRepositoryLink(ctx, domain.OrgRepositoryLink{
		OrgID:  "org-a",
		RepoID: "bitbucket_server:AD/pending-repo",
	})

	svc := service.NewSyncService(nil, nil, store, nil)

	orgRepos, err := svc.ListIndexedRepos("org-a")
	if err != nil {
		t.Fatalf("ListIndexedRepos(org-a): %v", err)
	}
	if len(orgRepos) != 2 {
		t.Fatalf("expected 2 org-a repos, got %d", len(orgRepos))
	}

	ids := map[string]struct{}{orgRepos[0].RepoID: {}, orgRepos[1].RepoID: {}}
	if _, ok := ids["github:org/shared-repo"]; !ok {
		t.Fatalf("expected shared gateway repo for org-a")
	}
	if _, ok := ids["bitbucket_server:AD/pending-repo"]; !ok {
		t.Fatalf("expected pending gateway repo for org-a")
	}

	allRepos, err := svc.ListIndexedRepos("")
	if err != nil {
		t.Fatalf("ListIndexedRepos(): %v", err)
	}
	if len(allRepos) != 2 {
		t.Fatalf("expected 2 global repos, got %d", len(allRepos))
	}

	orgBRepos, err := svc.ListIndexedRepos("org-b")
	if err != nil {
		t.Fatalf("ListIndexedRepos(org-b): %v", err)
	}
	if len(orgBRepos) != 1 || orgBRepos[0].RepoID != "github:org/shared-repo" {
		t.Fatalf("expected org-b to see shared repo only, got %+v", orgBRepos)
	}

	for _, repo := range orgRepos {
		if repo.RepoID == "bitbucket_server:AD/pending-repo" && repo.Status != apicontract.IndexedRepoStatusIndexing {
			t.Fatalf("pending repo status: got %q", repo.Status)
		}
	}
}