apply plugin: TaBuildPlugin

def getLLVMPath() {
    def llvm = null
    println "Ifaa chipset name :" + IFAA_CHIP_NAME
    switch (IFAA_CHIP_NAME) {
        case 'MSM8953':
        case 'MSM8976':
        case 'MSM8996':
        case 'SDM450':
            if (!project.hasProperty('LLVM_3524_PATH')) {
                throw new GradleException("Please set LLVM_3524_PATH in gradle.properties file.\n" +
                        "Example: LLVM_3524_PATH=/toolchains/Qualcomm/llvm/3.5.2.4")
            }
            llvm = LLVM_3524_PATH
            break
        case 'MSM8998':
        case 'SDM660':
            if (!project.hasProperty('LLVM_374_PATH')) {
                throw new GradleException("Please set LLVM_374_PATH in gradle.properties file.\n" +
                        "Example: LLVM_374_PATH=/toolchains/Qualcomm/llvm/3.7.4")
            }

            llvm = LLVM_374_PATH
            break
        case 'SDM845':
            if (!project.hasProperty('LLVM_396_PATH')) {
                throw new GradleException("Please set LLVM_396_PATH in gradle.properties file.\n" +
                        "Example: LLVM_396_PATH=/toolchains/Qualcomm/llvm/3.9.6")
            }

            llvm = LLVM_396_PATH
            break
        case 'SM8150':
            if (!project.hasProperty('LLVM_399_PATH')) {
                throw new GradleException("Please set LLVM_396_PATH in gradle.properties file.\n" +
                        "Example: LLVM_399_PATH=/toolchains/Qualcomm/llvm/3.9.9")
            }

            llvm = LLVM_399_PATH
            break
        case 'SDM710':
            if (!project.hasProperty('LLVM_403_PATH')) {
                throw new GradleException("Please set LLVM_403_PATH in gradle.properties file.\n" +
                        "Example: LLVM_403_PATH=/toolchains/Qualcomm/llvm/4.0.3")
            }

            llvm = LLVM_403_PATH
            break

        case 'SM6150':
            if (!project.hasProperty('LLVM_4011_PATH')) {
                throw new GradleException("Please set LLVM_403_PATH in gradle.properties file.\n" +
                        "Example: LLVM_4011_PATH=/toolchains/Qualcomm/llvm/4.0.11")
            }

            llvm = LLVM_4011_PATH
            break
        default:
            break
    }
    return llvm
}

//For IfaaTa build ,command is ./gradlew IfaaTa:build
task build(type: Exec) {
    description 'Build IfaaTa project'

    // Set the environment variables to use for the process.
    environment.put("LLVM_PATH", getLLVMPath())
    environment.put("LINARO_AARCH64_PATH", LINARO_AARCH64_PATH)
    environment.put("LINARO_AARCH32_PATH", LINARO_AARCH32_PATH)
    environment.put('IFAA_TZ_SDK_PATH', getPath('IFAA_TZ_SDK_PATH'))
    if (IFAA_TZ_MODEL == "QCOM") {
        if (project.hasProperty('IFAA_TEST')){
            environment.put("IFAA_TEST",'true')
        }
        commandLine 'bash'.split(' ') +
                ((projectDir.absolutePath + "/../BuildScripts/qcom_build/build.sh").split(' ') +
                        IFAA_CHIP_NAME.split(' ') + getTzAbi()) as List
    }
}

task signTa(type: Exec) {
    description "Sign Ifaa trustlet using Samsung's sign server"

    environment.put("LLVM_PATH", getLLVMPath())
    environment.put("LINARO_AARCH64_PATH", LINARO_AARCH64_PATH)
    environment.put("LINARO_AARCH32_PATH", LINARO_AARCH32_PATH)
    environment.put('IFAA_TZ_SDK_PATH', getPath('IFAA_TZ_SDK_PATH'))

    // run sbash cript to build TAe
    if (IFAA_TZ_MODEL == "QCOM") {
        if (project.hasProperty('IFAA_TEST')){
            environment.put("IFAA_TEST",'true')
        }

        def cmdStr =((projectDir.absolutePath + "/../BuildScripts/qcom_build/build.sh").split(' ') +
                        ("SIGN").split(' ') + IFAA_CHIP_NAME.split(' ') + getTzAbi())

        print(cmdStr)
        
        commandLine 'bash'.split(' ') +
                ((projectDir.absolutePath + "/../BuildScripts/qcom_build/build.sh").split(' ') +
                        ("SIGN").split(' ') + IFAA_CHIP_NAME.split(' ') + getTzAbi()) as List
    }

}

task pushTa(type: Exec) {
    description "Push ifaa Trustlet to device"
    // environment IfaaBuildEnv.instance.getEnv()
    if (IFAA_TZ_MODEL == "QCOM") {
        commandLine 'bash', projectDir.absolutePath + "/../BuildScripts/qcom_build/upload.sh"
    }
}

String getTzAbi() {
    def TZ_ABI = ""
    if ("arm64-v8a" == IFAA_ABI) {
        TZ_ABI = "ARM64"
    }
    return TZ_ABI
}

def getTaDeviceConfig() {
    return new File('IfaaTa/src/ifaa_device_config.c')
}

task createDeviceConfigFile() << {
    description 'Generate device configuration.'

    def tzModelName, tzModelVersion, phyAddr, fingerprintSensorName, fingerprintSensorVersion, fpAuthTaName
    def codeString = ""

    if (getTzModel() == 'BLOWFISH') {
        (tzModelName, tzModelVersion, phyAddr, fingerprintSensorName, fingerprintSensorVersion) = getDeviceConfig()
        codeString += "#include <stdint.h>\n"
    } else {
        (tzModelName, tzModelVersion, fingerprintSensorName, fingerprintSensorVersion, fpAuthTaName) = getDeviceConfig()
    }

    codeString += \
        "const char* TEE_NAME = \"" + "$tzModelName" + "\";\n" +
            "const char* TEE_VERSION = \"" + "$tzModelVersion" + "\";\n" +
            "const char* FINGERPRINT_SENSOR_NAME = \"" + "$fingerprintSensorName" + "\";\n" +
            "const char* FINGERPRINT_SENSOR_VERSION = \"" + "$fingerprintSensorVersion" + "\";\n" +
            "const char* FINGERPRINT_AUTH_TA_NAME = \"" + "$fpAuthTaName" + "\";\n" +
            "const char* CHIP_NAME = \"" + IFAA_CHIP_NAME + "\";\n";

    if (getTzModel() == 'BLOWFISH') {
        codeString += "const uintptr_t PHY_ADDR = (uintptr_t) $phyAddr;\n";
    }

    getTaDeviceConfig().write(codeString)
}

project.tasks.pushTa.dependsOn project.tasks.signTa
project.tasks.build.dependsOn project.tasks.createDeviceConfigFile
project.tasks.signTa.dependsOn project.tasks.createDeviceConfigFile
