package git_test

import (
	"strings"
	"testing"

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

func TestValidateRepoID(t *testing.T) {
	tests := []struct {
		name    string
		repoID  string
		wantErr bool
	}{
		{name: "valid", repoID: "ad/example-repo", wantErr: false},
		{name: "empty", repoID: "", wantErr: true},
		{name: "traversal", repoID: "../evil/repo", wantErr: true},
		{name: "missing slug", repoID: "ad/", wantErr: true},
		{name: "too many parts", repoID: "a/b/c", wantErr: true},
	}

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

func TestRedactSecrets(t *testing.T) {
	text := "failed for user@example.com with token secret123"
	got := git.RedactSecrets(text, "user@example.com", "secret123")
	if got == text {
		t.Fatal("expected secrets to be redacted")
	}
	if containsAny(got, "user@example.com", "secret123") {
		t.Fatalf("redacted text still contains secrets: %q", got)
	}
}

func containsAny(s string, parts ...string) bool {
	for _, p := range parts {
		if p != "" && strings.Contains(s, p) {
			return true
		}
	}
	return false
}

func TestBasicAuthHeader(t *testing.T) {
	header := git.BasicAuthHeader("user@example.com", "token")
	if header == "" || header == "Authorization: Basic " {
		t.Fatalf("unexpected header: %q", header)
	}
}

func TestBitbucketCredentialAuth(t *testing.T) {
	gitArgs, env := git.BitbucketCredentialAuth("user@example.com", "token")
	if len(gitArgs) == 0 || len(env) == 0 {
		t.Fatal("expected git args and env for configured credentials")
	}
	if gitArgs[0] != "-c" || !strings.Contains(gitArgs[1], "credential.helper=") {
		t.Fatalf("unexpected git args: %v", gitArgs)
	}
	if !strings.Contains(env[0], "user@example.com") || !strings.Contains(env[1], "token") {
		t.Fatalf("unexpected env: %v", env)
	}

	emptyArgs, emptyEnv := git.BitbucketCredentialAuth("", "token")
	if len(emptyArgs) != 0 || len(emptyEnv) != 0 {
		t.Fatalf("expected no auth when username missing, got args=%v env=%v", emptyArgs, emptyEnv)
	}
}
