package android

import (
	"testing"

	"github.com/google/blueprint"
)

var licenseKindTests = []struct {
	name           string
	fs             MockFS
	expectedErrors []string
}{
	{
		name: "license_kind must not accept licenses property",
		fs: map[string][]byte{
			"top/Android.bp": []byte(`
				license_kind {
					name: "top_license",
					licenses: ["other_license"],
				}`),
		},
		expectedErrors: []string{
			`top/Android.bp:4:14: unrecognized property "licenses"`,
		},
	},
	{
		name: "bad license_kind",
		fs: map[string][]byte{
			"top/Android.bp": []byte(`
				license_kind {
					name: "top_notice",
					conditions: ["notice"],
				}`),
			"other/Android.bp": []byte(`
				mock_license {
					name: "other_notice",
					license_kinds: ["notice"],
				}`),
		},
		expectedErrors: []string{
			`other/Android.bp:2:5: "other_notice" depends on undefined module "notice"`,
		},
	},
	{
		name: "good license kind",
		fs: map[string][]byte{
			"top/Android.bp": []byte(`
				license_kind {
					name: "top_by_exception_only",
					conditions: ["by_exception_only"],
				}

				mock_license {
					name: "top_proprietary",
					license_kinds: ["top_by_exception_only"],
				}`),
			"other/Android.bp": []byte(`
				mock_license {
					name: "other_proprietary",
					license_kinds: ["top_proprietary"],
				}`),
		},
	},
	{
		name: "multiple license kinds",
		fs: map[string][]byte{
			"top/Android.bp": []byte(`
				license_kind {
					name: "top_notice",
					conditions: ["notice"],
				}

				license_kind {
					name: "top_by_exception_only",
					conditions: ["by_exception_only"],
				}

				mock_license {
					name: "top_allowed_as_notice",
					license_kinds: ["top_notice"],
				}

				mock_license {
					name: "top_proprietary",
					license_kinds: ["top_by_exception_only"],
				}`),
			"other/Android.bp": []byte(`
				mock_license {
					name: "other_rule",
					license_kinds: ["top_by_exception_only"],
				}`),
		},
	},
}

func TestLicenseKind(t *testing.T) {
	for _, test := range licenseKindTests {
		t.Run(test.name, func(t *testing.T) {
			GroupFixturePreparers(
				prepareForLicenseTest,
				FixtureRegisterWithContext(func(ctx RegistrationContext) {
					ctx.RegisterModuleType("mock_license", newMockLicenseModule)
				}),
				test.fs.AddToFixture(),
			).
				ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern(test.expectedErrors)).
				RunTest(t)
		})
	}
}

type mockLicenseProperties struct {
	License_kinds []string
}

type mockLicenseModule struct {
	ModuleBase
	DefaultableModuleBase

	properties mockLicenseProperties
}

func newMockLicenseModule() Module {
	m := &mockLicenseModule{}
	m.AddProperties(&m.properties)
	InitAndroidArchModule(m, HostAndDeviceSupported, MultilibCommon)
	InitDefaultableModule(m)
	return m
}

type licensekindTag struct {
	blueprint.BaseDependencyTag
}

func (j *mockLicenseModule) DepsMutator(ctx BottomUpMutatorContext) {
	m, ok := ctx.Module().(Module)
	if !ok {
		return
	}
	ctx.AddDependency(m, licensekindTag{}, j.properties.License_kinds...)
}

func (p *mockLicenseModule) GenerateAndroidBuildActions(ModuleContext) {
}
