// Copyright (C) 2024 The Android Open Source Project
//
// 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 api

import (
	"android/soong/android"
	"android/soong/java"
	"fmt"
	"testing"

	"github.com/google/blueprint/proptools"
)

var prepareForTestWithCombinedApis = android.GroupFixturePreparers(
	android.FixtureRegisterWithContext(registerBuildComponents),
	java.PrepareForTestWithJavaBuildComponents,
	android.FixtureAddTextFile("a/Android.bp", gatherRequiredDepsForTest()),
	java.PrepareForTestWithJavaSdkLibraryFiles,
	android.FixtureMergeMockFs(android.MockFS{
		"a/api/current.txt":            nil,
		"a/api/removed.txt":            nil,
		"a/api/system-current.txt":     nil,
		"a/api/system-removed.txt":     nil,
		"a/api/test-current.txt":       nil,
		"a/api/test-removed.txt":       nil,
		"a/api/module-lib-current.txt": nil,
		"a/api/module-lib-removed.txt": nil,
	}),
	android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
		variables.Allow_missing_dependencies = proptools.BoolPtr(true)
	}),
)

func gatherRequiredDepsForTest() string {
	var bp string

	extraLibraryModules := []string{
		"stable.core.platform.api.stubs",
		"core-lambda-stubs",
		"core.current.stubs",
		"ext",
		"framework",
		"android_stubs_current.from-text",
		"android_system_stubs_current.from-text",
		"android_test_stubs_current.from-text",
		"android_test_frameworks_core_stubs_current.from-text",
		"android_module_lib_stubs_current.from-text",
		"android_system_server_stubs_current.from-text",
		"android_stubs_current.from-source",
		"android_system_stubs_current.from-source",
		"android_test_stubs_current.from-source",
		"android_test_frameworks_core_stubs_current.from-source",
		"android_module_lib_stubs_current.from-source",
		"android_system_server_stubs_current.from-source",
		"android_stubs_current_exportable.from-source",
		"android_system_stubs_current_exportable.from-source",
		"android_test_stubs_current_exportable.from-source",
		"android_module_lib_stubs_current_exportable.from-source",
		"android_system_server_stubs_current_exportable.from-source",
		"stub-annotations",
	}

	extraSdkLibraryModules := []string{
		"framework-virtualization",
		"framework-location",
	}

	extraSystemModules := []string{
		"core-public-stubs-system-modules",
		"core-module-lib-stubs-system-modules",
		"stable-core-platform-api-stubs-system-modules",
	}

	extraFilegroupModules := []string{
		"non-updatable-current.txt",
		"non-updatable-removed.txt",
		"non-updatable-system-current.txt",
		"non-updatable-system-removed.txt",
		"non-updatable-test-current.txt",
		"non-updatable-test-removed.txt",
		"non-updatable-module-lib-current.txt",
		"non-updatable-module-lib-removed.txt",
		"non-updatable-system-server-current.txt",
		"non-updatable-system-server-removed.txt",
		"non-updatable-exportable-current.txt",
		"non-updatable-exportable-removed.txt",
		"non-updatable-exportable-system-current.txt",
		"non-updatable-exportable-system-removed.txt",
		"non-updatable-exportable-test-current.txt",
		"non-updatable-exportable-test-removed.txt",
		"non-updatable-exportable-module-lib-current.txt",
		"non-updatable-exportable-module-lib-removed.txt",
		"non-updatable-exportable-system-server-current.txt",
		"non-updatable-exportable-system-server-removed.txt",
	}

	for _, extra := range extraLibraryModules {
		bp += fmt.Sprintf(`
			java_library {
				name: "%s",
				srcs: ["a.java"],
				sdk_version: "none",
				system_modules: "stable-core-platform-api-stubs-system-modules",
				compile_dex: true,
			}
		`, extra)
	}

	for _, extra := range extraSdkLibraryModules {
		bp += fmt.Sprintf(`
			java_sdk_library {
				name: "%s",
				srcs: ["a.java"],
				public: {
					enabled: true,
				},
				system: {
					enabled: true,
				},
				test: {
					enabled: true,
				},
				module_lib: {
					enabled: true,
				},
				api_packages: [
					"foo",
				],
				sdk_version: "core_current",
				compile_dex: true,
				annotations_enabled: true,
			}
		`, extra)
	}

	for _, extra := range extraFilegroupModules {
		bp += fmt.Sprintf(`
			filegroup {
				name: "%[1]s",
			}
		`, extra)
	}

	for _, extra := range extraSystemModules {
		bp += fmt.Sprintf(`
			java_system_modules {
				name: "%[1]s",
				libs: ["%[1]s-lib"],
			}
			java_library {
				name: "%[1]s-lib",
				sdk_version: "none",
				system_modules: "none",
			}
		`, extra)
	}

	bp += fmt.Sprintf(`
		java_defaults {
			name: "android.jar_defaults",
		}
	`)

	return bp
}

func TestCombinedApisDefaults(t *testing.T) {

	result := android.GroupFixturePreparers(
		prepareForTestWithCombinedApis,
		java.FixtureWithLastReleaseApis(
			"framework-location", "framework-virtualization", "framework-foo", "framework-bar"),
		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
			variables.VendorVars = map[string]map[string]string{
				"boolean_var": {
					"for_testing": "true",
				},
			}
		}),
	).RunTestWithBp(t, `
		java_sdk_library {
			name: "framework-foo",
			srcs: ["a.java"],
			public: {
				enabled: true,
			},
			system: {
				enabled: true,
			},
			test: {
				enabled: true,
			},
			module_lib: {
				enabled: true,
			},
			api_packages: [
				"foo",
			],
			sdk_version: "core_current",
			annotations_enabled: true,
		}

		java_sdk_library {
			name: "framework-bar",
			srcs: ["a.java"],
			public: {
				enabled: true,
			},
			system: {
				enabled: true,
			},
			test: {
				enabled: true,
			},
			module_lib: {
				enabled: true,
			},
			api_packages: [
				"foo",
			],
			sdk_version: "core_current",
			annotations_enabled: true,
		}

		combined_apis {
			name: "foo",
			bootclasspath: [
				"framework-bar",
			] + select(boolean_var_for_testing(), {
				true: [
					"framework-foo",
				],
				default: [],
			}),
		}
	`)

	subModuleDependsOnSelectAppendedModule := java.CheckModuleHasDependency(t,
		result.TestContext, "foo-current.txt", "", "framework-foo")
	android.AssertBoolEquals(t, "Submodule expected to depend on the select-appended module",
		true, subModuleDependsOnSelectAppendedModule)
}
