package git_test

import (
	"testing"

	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/git"
)

func TestBuildGatewayRepoID(t *testing.T) {
	got := git.BuildGatewayRepoID("github", "acme/widget")
	if got != "github:acme/widget" {
		t.Fatalf("got %q", got)
	}
}

func TestIsGatewayRepoID(t *testing.T) {
	if !git.IsGatewayRepoID("github:acme/widget") {
		t.Fatal("expected gateway repo id")
	}
	if git.IsGatewayRepoID("ad/widget") {
		t.Fatal("legacy repo id should not be gateway format")
	}
}

func TestValidateGatewayRepoID(t *testing.T) {
	tests := []struct {
		name    string
		repoID  string
		wantErr bool
	}{
		{name: "valid github", repoID: "github:acme/widget", wantErr: false},
		{name: "valid bitbucket cloud", repoID: "bitbucket_cloud:team/repo", wantErr: false},
		{name: "valid bitbucket server", repoID: "bitbucket_server:AD/widget", wantErr: false},
		{name: "missing colon", repoID: "github-acme/widget", wantErr: true},
		{name: "empty provider", repoID: ":acme/widget", wantErr: true},
		{name: "too many slashes", repoID: "github:acme/widget/extra", wantErr: true},
		{name: "path traversal", repoID: "github:acme/../evil", wantErr: true},
		{name: "empty owner", repoID: "github:/widget", wantErr: true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := git.ValidateGatewayRepoID(tt.repoID)
			if tt.wantErr && err == nil {
				t.Fatal("expected error")
			}
			if !tt.wantErr && err != nil {
				t.Fatalf("unexpected error: %v", err)
			}
		})
	}
}

func TestParseRepoIDForRead(t *testing.T) {
	if err := git.ParseRepoIDForRead("ad/example-repo"); err != nil {
		t.Fatalf("legacy repo_id: %v", err)
	}
	if err := git.ParseRepoIDForRead("github:acme/widget"); err != nil {
		t.Fatalf("gateway repo_id: %v", err)
	}
	if err := git.ParseRepoIDForRead("invalid"); err == nil {
		t.Fatal("expected error for invalid repo_id")
	}
}
