package server

import (
	"context"
	"testing"

	agsserver "github.com/pingcap/agent-git-service/server"

	"github.com/tidbcloud/AgentTeam/internal/service/kb"
	"github.com/tidbcloud/AgentTeam/internal/service/resource/repos"
)

type mirrorPushFakeAGS struct {
	fakeAGS
	request agsserver.RepositoryMirrorPushRequest
}

func (f *mirrorPushFakeAGS) PushRepositoryMirror(_ context.Context, request agsserver.RepositoryMirrorPushRequest) error {
	f.request = request
	return nil
}

func TestNativeSourceMirrorPusherAdaptsEmbeddedAGSCapability(t *testing.T) {
	ags := &mirrorPushFakeAGS{}
	pusher := nativeSourceMirrorPusher(ags)
	if pusher == nil {
		t.Fatal("nativeSourceMirrorPusher returned nil for supported AGS server")
	}
	request := kb.NativeSourceMirrorPushRequest{
		SourceGitDir: "/source.git",
		Target:       repos.RepositoryIdentity{Owner: "owner", Name: "target"},
		RefSpecs:     []string{"+refs/heads/*:refs/heads/*"},
	}
	if err := pusher.PushSourceMirror(t.Context(), request); err != nil {
		t.Fatalf("PushSourceMirror: %v", err)
	}
	if got, want := ags.request.RepositoryFullName, "owner/target"; got != want {
		t.Fatalf("RepositoryFullName = %q, want %q", got, want)
	}
	if got, want := ags.request.SourceGitDir, request.SourceGitDir; got != want {
		t.Fatalf("SourceGitDir = %q, want %q", got, want)
	}
	if len(ags.request.RefSpecs) != 1 || ags.request.RefSpecs[0] != request.RefSpecs[0] {
		t.Fatalf("RefSpecs = %v, want %v", ags.request.RefSpecs, request.RefSpecs)
	}
	request.RefSpecs[0] = "changed"
	if ags.request.RefSpecs[0] == request.RefSpecs[0] {
		t.Fatal("PushSourceMirror did not copy refspecs across the ownership boundary")
	}
}

func TestNativeSourceMirrorPusherIgnoresUnsupportedAGSServer(t *testing.T) {
	if pusher := nativeSourceMirrorPusher(fakeAGS{}); pusher != nil {
		t.Fatalf("nativeSourceMirrorPusher(fakeAGS) = %T, want nil", pusher)
	}
}
