package java

import (
	"strings"
	"testing"

	"android/soong/android"
	soongTesting "android/soong/testing"
	"android/soong/testing/code_metadata_internal_proto"
	"google.golang.org/protobuf/proto"
)

func TestCodeMetadata(t *testing.T) {
	bp := `code_metadata {
		name: "module-name",
		teamId: "12345",
		code: [
			"foo",
		]
	}

	java_sdk_library {
		name: "foo",
		srcs: ["a.java"],
	}`
	result := runCodeMetadataTest(t, android.FixtureExpectsNoErrors, bp)

	module := result.ModuleForTests(
		"module-name", "",
	).Module().(*soongTesting.CodeMetadataModule)

	// Check that the provider has the right contents
	data, _ := android.SingletonModuleProvider(result, module, soongTesting.CodeMetadataProviderKey)
	if !strings.HasSuffix(
		data.IntermediatePath.String(), "/intermediateCodeMetadata.pb",
	) {
		t.Errorf(
			"Missing intermediates path in provider: %s",
			data.IntermediatePath.String(),
		)
	}

	buildParamsSlice := module.BuildParamsForTests()
	var metadata = ""
	for _, params := range buildParamsSlice {
		if params.Rule.String() == "android/soong/android.writeFile" {
			metadata = params.Args["content"]
		}
	}

	metadataList := make([]*code_metadata_internal_proto.CodeMetadataInternal_TargetOwnership, 0, 2)
	teamId := "12345"
	bpFilePath := "Android.bp"
	targetName := "foo"
	srcFile := []string{"a.java"}
	expectedMetadataProto := code_metadata_internal_proto.CodeMetadataInternal_TargetOwnership{
		TrendyTeamId: &teamId,
		TargetName:   &targetName,
		Path:         &bpFilePath,
		SourceFiles:  srcFile,
	}
	metadataList = append(metadataList, &expectedMetadataProto)

	CodeMetadataMetadata := code_metadata_internal_proto.CodeMetadataInternal{TargetOwnershipList: metadataList}
	protoData, _ := proto.Marshal(&CodeMetadataMetadata)
	rawData := string(protoData)
	formattedData := strings.ReplaceAll(rawData, "\n", "\\n")
	expectedMetadata := "'" + formattedData + "\\n'"

	if metadata != expectedMetadata {
		t.Errorf(
			"Retrieved metadata: %s is not equal to expectedMetadata: %s", metadata,
			expectedMetadata,
		)
	}

	// Tests for all_test_spec singleton.
	singleton := result.SingletonForTests("all_code_metadata")
	rule := singleton.Rule("all_code_metadata_rule")
	prebuiltOs := result.Config.PrebuiltOS()
	expectedCmd := "out/soong/host/" + prebuiltOs + "/bin/metadata -rule code_metadata -inputFile out/soong/all_code_metadata_paths.rsp -outputFile out/soong/ownership/all_code_metadata.pb"
	expectedOutputFile := "out/soong/ownership/all_code_metadata.pb"
	expectedInputFile := "out/soong/.intermediates/module-name/intermediateCodeMetadata.pb"
	if !strings.Contains(
		strings.TrimSpace(rule.Output.String()),
		expectedOutputFile,
	) {
		t.Errorf(
			"Retrieved singletonOutputFile: %s is not equal to expectedSingletonOutputFile: %s",
			rule.Output.String(), expectedOutputFile,
		)
	}

	if !strings.Contains(
		strings.TrimSpace(rule.Inputs[0].String()),
		expectedInputFile,
	) {
		t.Errorf(
			"Retrieved singletonInputFile: %s is not equal to expectedSingletonInputFile: %s",
			rule.Inputs[0].String(), expectedInputFile,
		)
	}

	if !strings.Contains(
		strings.TrimSpace(rule.RuleParams.Command),
		expectedCmd,
	) {
		t.Errorf(
			"Retrieved cmd: %s doesn't contain expectedCmd: %s",
			rule.RuleParams.Command, expectedCmd,
		)
	}
}
func runCodeMetadataTest(
	t *testing.T, errorHandler android.FixtureErrorHandler, bp string,
) *android.TestResult {
	return android.GroupFixturePreparers(
		soongTesting.PrepareForTestWithTestingBuildComponents, prepareForJavaTest,
		PrepareForTestWithJavaSdkLibraryFiles, FixtureWithLastReleaseApis("foo"),
	).
		ExtendWithErrorHandler(errorHandler).
		RunTestWithBp(t, bp)
}
