// Copyright 2018 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 selinux

import (
	"android/soong/android"
	"path/filepath"
)

func init() {
	android.RegisterModuleType("se_filegroup", FileGroupFactory)
}

func FileGroupFactory() android.Module {
	module := &fileGroup{}
	module.AddProperties(&module.properties)
	android.InitAndroidModule(module)
	return module
}

type fileGroupProperties struct {
	// list of source file suffixes used to collect selinux policy files.
	// Source files will be looked up in the following local directories:
	// system/sepolicy/{public, private, vendor, reqd_mask}
	// and directories specified by following config variables:
	// BOARD_SEPOLICY_DIRS, BOARD_ODM_SEPOLICY_DIRS
	// SYSTEM_EXT_PUBLIC_SEPOLICY_DIR, SYSTEM_EXT_PRIVATE_SEPOLICY_DIR
	Srcs []string
}

type fileGroup struct {
	android.ModuleBase
	properties fileGroupProperties

	systemPublicSrcs   android.Paths
	systemPrivateSrcs  android.Paths
	systemVendorSrcs   android.Paths
	systemReqdMaskSrcs android.Paths

	systemExtPublicSrcs  android.Paths
	systemExtPrivateSrcs android.Paths

	productPublicSrcs  android.Paths
	productPrivateSrcs android.Paths

	vendorSrcs         android.Paths
	vendorReqdMaskSrcs android.Paths
	odmSrcs            android.Paths
}

// Source files from system/sepolicy/public
func (fg *fileGroup) SystemPublicSrcs() android.Paths {
	return fg.systemPublicSrcs
}

// Source files from system/sepolicy/private
func (fg *fileGroup) SystemPrivateSrcs() android.Paths {
	return fg.systemPrivateSrcs
}

// Source files from system/sepolicy/vendor
func (fg *fileGroup) SystemVendorSrcs() android.Paths {
	return fg.systemVendorSrcs
}

// Source files from system/sepolicy/reqd_mask
func (fg *fileGroup) SystemReqdMaskSrcs() android.Paths {
	return fg.systemReqdMaskSrcs
}

// Source files from SYSTEM_EXT_PUBLIC_SEPOLICY_DIR
func (fg *fileGroup) SystemExtPublicSrcs() android.Paths {
	return fg.systemExtPublicSrcs
}

// Source files from SYSTEM_EXT_PRIVATE_SEPOLICY_DIR
func (fg *fileGroup) SystemExtPrivateSrcs() android.Paths {
	return fg.systemExtPrivateSrcs
}

// Source files from PRODUCT_PUBLIC_SEPOLICY_DIRS
func (fg *fileGroup) ProductPublicSrcs() android.Paths {
	return fg.productPublicSrcs
}

// Source files from PRODUCT_PRIVATE_SEPOLICY_DIRS
func (fg *fileGroup) ProductPrivateSrcs() android.Paths {
	return fg.productPrivateSrcs
}

// Source files from BOARD_VENDOR_SEPOLICY_DIRS
func (fg *fileGroup) VendorSrcs() android.Paths {
	return fg.vendorSrcs
}

func (fg *fileGroup) VendorReqdMaskSrcs() android.Paths {
	return fg.vendorReqdMaskSrcs
}

// Source files from BOARD_ODM_SEPOLICY_DIRS
func (fg *fileGroup) OdmSrcs() android.Paths {
	return fg.odmSrcs
}

func (fg *fileGroup) findSrcsInDirs(ctx android.ModuleContext, dirs []string) android.Paths {
	result := android.Paths{}
	for _, f := range fg.properties.Srcs {
		for _, d := range dirs {
			path := filepath.Join(d, f)
			files, _ := ctx.GlobWithDeps(path, nil)
			for _, f := range files {
				result = append(result, android.PathForSource(ctx, f))
			}
		}
	}
	return result
}

func (fg *fileGroup) findSrcsInDir(ctx android.ModuleContext, dir string) android.Paths {
	return fg.findSrcsInDirs(ctx, []string{dir})
}

func (fg *fileGroup) DepsMutator(ctx android.BottomUpMutatorContext) {}

func (fg *fileGroup) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	fg.systemPublicSrcs = fg.findSrcsInDir(ctx, filepath.Join(ctx.ModuleDir(), "public"))
	fg.systemPrivateSrcs = fg.findSrcsInDir(ctx, filepath.Join(ctx.ModuleDir(), "private"))
	fg.systemVendorSrcs = fg.findSrcsInDir(ctx, filepath.Join(ctx.ModuleDir(), "vendor"))
	fg.systemReqdMaskSrcs = fg.findSrcsInDir(ctx, filepath.Join(ctx.ModuleDir(), "reqd_mask"))

	fg.systemExtPublicSrcs = fg.findSrcsInDirs(ctx, ctx.DeviceConfig().SystemExtPublicSepolicyDirs())
	fg.systemExtPrivateSrcs = fg.findSrcsInDirs(ctx, ctx.DeviceConfig().SystemExtPrivateSepolicyDirs())

	fg.productPublicSrcs = fg.findSrcsInDirs(ctx, ctx.Config().ProductPublicSepolicyDirs())
	fg.productPrivateSrcs = fg.findSrcsInDirs(ctx, ctx.Config().ProductPrivateSepolicyDirs())

	fg.vendorReqdMaskSrcs = fg.findSrcsInDirs(ctx, ctx.DeviceConfig().BoardReqdMaskPolicy())
	fg.vendorSrcs = fg.findSrcsInDirs(ctx, ctx.DeviceConfig().VendorSepolicyDirs())
	fg.odmSrcs = fg.findSrcsInDirs(ctx, ctx.DeviceConfig().OdmSepolicyDirs())
}
