# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2017 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.
#
#-------------------------------------------------------------------------

import os
import posixpath
from fnmatch import fnmatch

from build.common import DEQP_DIR, writeFile

SRC_ROOTS = [
	"execserver",
	"executor",
	"external/vulkancts",
	"framework/common",
	"framework/delibs",
	"framework/egl",
	"framework/opengl",
	"framework/platform/android",
	"framework/qphelper",
	"framework/randomshaders",
	"framework/referencerenderer",
	"modules",
]

INCLUDE_PATTERNS = [
	"*.cpp",
	"*.c",
]

EXCLUDE_PATTERNS = [
	"execserver/xsWin32TestProcess.cpp",
	"external/vulkancts/modules/vulkan/vktBuildPrograms.cpp",
	"framework/delibs/dethread/standalone_test.c",
	"framework/randomshaders/rsgTest.cpp",
	"executor/tools/*",
	"execserver/tools/*",
]

TEMPLATE = """
// WARNING: This is auto-generated file. Do not modify, since changes will
// be lost! Modify scripts/gen_android_bp.py instead.

cc_defaults {
    name: "libdeqp_gen",

    srcs: [
{SRC_FILES}    ],
    local_include_dirs: [
{INCLUDES}    ],
}

"""[1:-1]

def matchesAny (filename, patterns):
	for ptrn in patterns:
		if fnmatch(filename, ptrn):
			return True
	return False

def isSourceFile (filename):
	return matchesAny(filename, INCLUDE_PATTERNS) and not matchesAny(filename, EXCLUDE_PATTERNS)

def toPortablePath (nativePath):
	# os.path is so convenient...
	head, tail	= os.path.split(nativePath)
	components	= [tail]

	while head != None and head != '':
		head, tail = os.path.split(head)
		components.append(tail)

	components.reverse()

	portablePath = ""
	for component in components:
		portablePath = posixpath.join(portablePath, component)

	return portablePath

def getSourceFiles ():
	sources = []

	for srcRoot in SRC_ROOTS:
		baseDir = os.path.join(DEQP_DIR, srcRoot)
		for root, dirs, files in os.walk(baseDir):
			for file in files:
				absPath			= os.path.join(root, file)
				nativeRelPath	= os.path.relpath(absPath, DEQP_DIR)
				portablePath	= toPortablePath(nativeRelPath)

				if isSourceFile(portablePath):
					sources.append(portablePath)

	sources.sort()

	return sources

def getSourceDirs (sourceFiles):
	seenDirs	= set()
	sourceDirs	= []

	for sourceFile in sourceFiles:
		sourceDir = posixpath.dirname(sourceFile)

		if not sourceDir in seenDirs:
			sourceDirs.append(sourceDir)
			seenDirs.add(sourceDir)

	return sourceDirs

def genBpStringList (items):
	src = ""

	for item in items:
		src += "       \"%s\",\n" % item

	return src

def genAndroidBp (sourceDirs, sourceFiles):
	src = TEMPLATE
	src = src.replace("{INCLUDES}", genBpStringList(sourceDirs))
	src = src.replace("{SRC_FILES}", genBpStringList(sourceFiles))

	return src

if __name__ == "__main__":
	sourceFiles		= getSourceFiles()
	sourceDirs		= getSourceDirs(sourceFiles)
	androidBpText	= genAndroidBp(sourceDirs, sourceFiles)

	writeFile(os.path.join(DEQP_DIR, "AndroidGen.bp"), androidBpText)
