package watch

import (
	"path/filepath"
	"testing"
)

func TestExtraWatchDefaultsToUnifiedAgentTeamTarget(t *testing.T) {
	repoRoot := t.TempDir()
	t.Setenv("AGENTTEAM_DEV_EXTRA_WATCH", "../source-mirror")

	dirs, err := ExtraFromEnv(repoRoot)
	if err != nil {
		t.Fatalf("parse extra watch: %v", err)
	}
	if len(dirs) != 1 || dirs[0].Target != ChangeAgentTeam {
		t.Fatalf("extra watch dirs = %#v, want one unified AgentTeam target", dirs)
	}
	wantPath := filepath.Clean(filepath.Join(repoRoot, "../source-mirror"))
	if dirs[0].Path != wantPath {
		t.Fatalf("extra watch path = %q, want %q", dirs[0].Path, wantPath)
	}
}

func TestExtraWatchMeshXAliasTargetsUnifiedAgentTeam(t *testing.T) {
	repoRoot := t.TempDir()
	t.Setenv("AGENTTEAM_DEV_EXTRA_WATCH", "../source-mirror=meshx")

	dirs, err := ExtraFromEnv(repoRoot)
	if err != nil {
		t.Fatalf("parse extra watch: %v", err)
	}
	if len(dirs) != 1 || dirs[0].Target != ChangeAgentTeam {
		t.Fatalf("extra watch dirs = %#v, want one unified AgentTeam target", dirs)
	}
}

func TestExtraWatchRejectsUnknownTarget(t *testing.T) {
	t.Setenv("AGENTTEAM_DEV_EXTRA_WATCH", "../source-mirror=unknown")

	_, err := ExtraFromEnv(t.TempDir())
	if err == nil {
		t.Fatal("unknown extra watch target unexpectedly succeeded")
	}
}

func TestServerWatcherIgnoresDesktopOwnedSources(t *testing.T) {
	repoRoot := t.TempDir()
	target := ChangeTarget(repoRoot, filepath.Join(repoRoot, "desktop", "main.go"), nil)
	if target != ChangeNone {
		t.Fatalf("desktop change target = %d, want none because desktop owns its watcher", target)
	}
}

func TestServerWatcherOnlyProducesUnifiedAgentTeamTarget(t *testing.T) {
	repoRoot := t.TempDir()
	for _, path := range []string{
		"cmd/agentteam-server/main.go",
		"internal/server/server.go",
		"internal/meshxruntime/runtime.go",
		"go.mod",
	} {
		target := ChangeTarget(repoRoot, filepath.Join(repoRoot, filepath.FromSlash(path)), nil)
		if target != ChangeAgentTeam {
			t.Fatalf("change target for %s = %d, want unified AgentTeam target %d", path, target, ChangeAgentTeam)
		}
	}
}
