package importgraph

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/AgentTeam/kits/agentteam-insight/internal/graphbuilder/extractor"
	"github.com/tidbcloud/AgentTeam/kits/agentteam-insight/internal/graphbuilder/scanner"
)

func TestBuildResolvesInternalGoImports(t *testing.T) {
	files := []scanner.FileInfo{
		{Path: "cmd/app/main.go", Language: "go"},
		{Path: "internal/util/util.go", Language: "go"},
	}
	analyses := []extractor.StructuralAnalysis{
		{FilePath: "cmd/app/main.go", Imports: []extractor.Import{{Path: "fmt"}, {Path: "example.com/acme/internal/util"}}},
		{FilePath: "internal/util/util.go"},
	}
	graph := Build(files, analyses)
	require.Equal(t, []ImportEdge{{SourcePath: "cmd/app/main.go", TargetPath: "internal/util/util.go", ImportPath: "example.com/acme/internal/util"}}, graph.ImportMap["cmd/app/main.go"])
	require.Empty(t, graph.ImportMap["internal/util/util.go"])
}

func TestBuildResolvesTenFamilyInternalImports(t *testing.T) {
	files := []scanner.FileInfo{
		{Path: "web/app.ts", Language: "typescript"},
		{Path: "web/util.ts", Language: "typescript"},
		{Path: "pkg/main.py", Language: "python"},
		{Path: "pkg/helpers.py", Language: "python"},
		{Path: "src/lib.rs", Language: "rust"},
		{Path: "src/service.rs", Language: "rust"},
		{Path: "src/main/java/com/acme/App.java", Language: "java"},
		{Path: "src/main/java/com/acme/Util.java", Language: "java"},
		{Path: "src/App.kt", Language: "kotlin"},
		{Path: "src/main/kotlin/com/acme/Feature.kt", Language: "kotlin"},
		{Path: "dotnet/App.cs", Language: "csharp"},
		{Path: "dotnet/src/Acme/Util.cs", Language: "csharp"},
		{Path: "php/app.php", Language: "php"},
		{Path: "php/lib/tool.php", Language: "php"},
		{Path: "native/main.c", Language: "c"},
		{Path: "native/util.h", Language: "c"},
		{Path: "ruby/app.rb", Language: "ruby"},
		{Path: "ruby/lib/tool.rb", Language: "ruby"},
	}
	analyses := []extractor.StructuralAnalysis{
		{FilePath: "web/app.ts", Language: "typescript", Imports: []extractor.Import{{Path: "./util"}}},
		{FilePath: "pkg/main.py", Language: "python", Imports: []extractor.Import{{Path: "pkg.helpers"}}},
		{FilePath: "src/lib.rs", Language: "rust", Imports: []extractor.Import{{Path: "crate::service"}}},
		{FilePath: "src/main/java/com/acme/App.java", Language: "java", Imports: []extractor.Import{{Path: "com.acme.Util"}}},
		{FilePath: "src/App.kt", Language: "kotlin", Imports: []extractor.Import{{Path: "com.acme.Feature"}}},
		{FilePath: "dotnet/App.cs", Language: "csharp", Imports: []extractor.Import{{Path: "Acme.Util"}}},
		{FilePath: "php/app.php", Language: "php", Imports: []extractor.Import{{Path: "./lib/tool.php"}}},
		{FilePath: "native/main.c", Language: "c", Imports: []extractor.Import{{Path: "util.h"}}},
		{FilePath: "ruby/app.rb", Language: "ruby", Imports: []extractor.Import{{Path: "./lib/tool"}}},
	}

	graph := Build(files, analyses)

	require.Equal(t, []ImportEdge{{SourcePath: "web/app.ts", TargetPath: "web/util.ts", ImportPath: "./util"}}, graph.ImportMap["web/app.ts"])
	require.Equal(t, []ImportEdge{{SourcePath: "pkg/main.py", TargetPath: "pkg/helpers.py", ImportPath: "pkg.helpers"}}, graph.ImportMap["pkg/main.py"])
	require.Equal(t, []ImportEdge{{SourcePath: "src/lib.rs", TargetPath: "src/service.rs", ImportPath: "crate::service"}}, graph.ImportMap["src/lib.rs"])
	require.Equal(t, []ImportEdge{{SourcePath: "src/main/java/com/acme/App.java", TargetPath: "src/main/java/com/acme/Util.java", ImportPath: "com.acme.Util"}}, graph.ImportMap["src/main/java/com/acme/App.java"])
	require.Equal(t, []ImportEdge{{SourcePath: "src/App.kt", TargetPath: "src/main/kotlin/com/acme/Feature.kt", ImportPath: "com.acme.Feature"}}, graph.ImportMap["src/App.kt"])
	require.Equal(t, []ImportEdge{{SourcePath: "dotnet/App.cs", TargetPath: "dotnet/src/Acme/Util.cs", ImportPath: "Acme.Util"}}, graph.ImportMap["dotnet/App.cs"])
	require.Equal(t, []ImportEdge{{SourcePath: "php/app.php", TargetPath: "php/lib/tool.php", ImportPath: "./lib/tool.php"}}, graph.ImportMap["php/app.php"])
	require.Equal(t, []ImportEdge{{SourcePath: "native/main.c", TargetPath: "native/util.h", ImportPath: "util.h"}}, graph.ImportMap["native/main.c"])
	require.Equal(t, []ImportEdge{{SourcePath: "ruby/app.rb", TargetPath: "ruby/lib/tool.rb", ImportPath: "./lib/tool"}}, graph.ImportMap["ruby/app.rb"])
}
