// Copyright 2024 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 compliance

import (
	"path/filepath"

	"android/soong/android"

	"github.com/google/blueprint"
)

func init() {
	RegisterNoticeXmlBuildComponents(android.InitRegistrationContext)
}

var PrepareForTestWithNoticeXmlBuildComponents = android.GroupFixturePreparers(
	android.FixtureRegisterWithContext(RegisterNoticeXmlBuildComponents),
)

var PrepareForTestWithNoticeXml = android.GroupFixturePreparers(
	PrepareForTestWithNoticeXmlBuildComponents,
)

func RegisterNoticeXmlBuildComponents(ctx android.RegistrationContext) {
	ctx.RegisterModuleType("notice_xml", NoticeXmlFactory)
}

var (
	pctx = android.NewPackageContext("android/soong/compliance")

	genNoticeXml = pctx.HostBinToolVariable("genNoticeXml", "gen_notice_xml")

	// Command to generate NOTICE.xml.gz for a partition
	genNoticeXmlRule = pctx.AndroidStaticRule("genNoticeXmlRule", blueprint.RuleParams{
		Command: "rm -rf $out && " +
			"${genNoticeXml} --output_file ${out} --metadata ${in} --partition ${partition} --product_out ${productOut} --soong_out ${soongOut}",
		CommandDeps: []string{"${genNoticeXml}"},
	}, "partition", "productOut", "soongOut")
)

func NoticeXmlFactory() android.Module {
	m := &NoticeXmlModule{}
	m.AddProperties(&m.props)
	android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibFirst)
	return m
}

type NoticeXmlModule struct {
	android.ModuleBase

	props noticeXmlProperties

	outputFile android.OutputPath
}

type noticeXmlProperties struct {
	Partition_name string
}

func (nx *NoticeXmlModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	output := android.PathForModuleOut(ctx, "NOTICE.xml.gz")
	metadataDb := android.PathForOutput(ctx, "compliance-metadata", ctx.Config().DeviceProduct(), "compliance-metadata.db")
	ctx.Build(pctx, android.BuildParams{
		Rule:   genNoticeXmlRule,
		Input:  metadataDb,
		Output: output,
		Args: map[string]string{
			"productOut": filepath.Join(ctx.Config().OutDir(), "target", "product", ctx.Config().DeviceName()),
			"soongOut":   ctx.Config().SoongOutDir(),
			"partition":  nx.props.Partition_name,
		},
	})

	nx.outputFile = output.OutputPath

	installPath := android.PathForModuleInPartitionInstall(ctx, nx.props.Partition_name, "etc")
	ctx.PackageFile(installPath, "NOTICE.xml.gz", nx.outputFile)
}

func (nx *NoticeXmlModule) AndroidMkEntries() []android.AndroidMkEntries {
	return []android.AndroidMkEntries{{
		Class:      "ETC",
		OutputFile: android.OptionalPathForPath(nx.outputFile),
	}}
}
