// Copyright 2020 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package android

func init() {
	RegisterSingletonType("testsuites", testSuiteFilesFactory)
}

func testSuiteFilesFactory() Singleton {
	return &testSuiteFiles{}
}

type testSuiteFiles struct {
	robolectric WritablePath
}

type TestSuiteModule interface {
	Module
	TestSuites() []string
}

func (t *testSuiteFiles) GenerateBuildActions(ctx SingletonContext) {
	files := make(map[string]map[string]InstallPaths)

	ctx.VisitAllModules(func(m Module) {
		if tsm, ok := m.(TestSuiteModule); ok {
			for _, testSuite := range tsm.TestSuites() {
				if files[testSuite] == nil {
					files[testSuite] = make(map[string]InstallPaths)
				}
				name := ctx.ModuleName(m)
				files[testSuite][name] = append(files[testSuite][name], tsm.filesToInstall()...)
			}
		}
	})

	t.robolectric = robolectricTestSuite(ctx, files["robolectric-tests"])

	ctx.Phony("robolectric-tests", t.robolectric)
}

func (t *testSuiteFiles) MakeVars(ctx MakeVarsContext) {
	ctx.DistForGoal("robolectric-tests", t.robolectric)
}

func robolectricTestSuite(ctx SingletonContext, files map[string]InstallPaths) WritablePath {
	var installedPaths InstallPaths
	for _, module := range SortedStringKeys(files) {
		installedPaths = append(installedPaths, files[module]...)
	}
	testCasesDir := pathForInstall(ctx, BuildOs, X86, "testcases", false).ToMakePath()

	outputFile := PathForOutput(ctx, "packaging", "robolectric-tests.zip")
	rule := NewRuleBuilder()
	rule.Command().BuiltTool(ctx, "soong_zip").
		FlagWithOutput("-o ", outputFile).
		FlagWithArg("-P ", "host/testcases").
		FlagWithArg("-C ", testCasesDir.String()).
		FlagWithRspFileInputList("-r ", installedPaths.Paths())
	rule.Build(pctx, ctx, "robolectric_tests_zip", "robolectric-tests.zip")

	return outputFile
}
