package testing

import (
	"android/soong/android"
)

const fileContainingCodeMetadataFilePaths = "all_code_metadata_paths.rsp"
const allCodeMetadataFile = "all_code_metadata.pb"

func AllCodeMetadataFactory() android.Singleton {
	return &allCodeMetadataSingleton{}
}

type allCodeMetadataSingleton struct {
	// Path where the collected metadata is stored after successful validation.
	outputPath android.OutputPath
}

func (this *allCodeMetadataSingleton) GenerateBuildActions(ctx android.SingletonContext) {
	var intermediateMetadataPaths android.Paths

	ctx.VisitAllModules(
		func(module android.Module) {
			if metadata, ok := android.OtherModuleProvider(ctx, module, CodeMetadataProviderKey); ok {
				intermediateMetadataPaths = append(intermediateMetadataPaths, metadata.IntermediatePath)
			}
		},
	)

	rspFile := android.PathForOutput(ctx, fileContainingCodeMetadataFilePaths)
	this.outputPath = android.PathForOutput(ctx, ownershipDirectory, allCodeMetadataFile)

	rule := android.NewRuleBuilder(pctx, ctx)
	cmd := rule.Command().
		BuiltTool("metadata").
		FlagWithArg("-rule ", "code_metadata").
		FlagWithRspFileInputList("-inputFile ", rspFile, intermediateMetadataPaths)
	cmd.FlagWithOutput("-outputFile ", this.outputPath)
	rule.Build("all_code_metadata_rule", "Generate all code metadata")

	ctx.Phony("all_code_metadata", this.outputPath)
}

func (this *allCodeMetadataSingleton) MakeVars(ctx android.MakeVarsContext) {
	ctx.DistForGoal("code_metadata", this.outputPath)
}
