#
# Copyright 2018,2020 NXP
# SPDX-License-Identifier: Apache-2.0
#

"""
Create CMake Projects

"""
import os
import platform
import stat
import sys

__VERSION__ = "2018.08.11_00"

#
# 2018.08.11_00 : Purnank : [SIMW-169] Added support for gnu-arm-gcc cross compilation
#

NINJA_EXE = r"C:/_ddm/opt/bin/ninja.exe"

class CMakeGenertor:  # pylint: disable=too-many-public-methods
    """
    Cmake generator class
    """
    def __init__(self, cmake_exe, root_dir):
        self.cmake_exe = cmake_exe
        self.source_root_dir = os.path.abspath(root_dir)
        target_root_dir = "%s/../%s_build" % (root_dir, os.path.basename(self.source_root_dir))
        self.target_root_dir = os.path.abspath(target_root_dir)
        self.warn_if_target_root_dir_not_empty()

    def warn_if_target_root_dir_not_empty(self):
        if not os.path.exists(self.target_root_dir):
            os.makedirs(self.target_root_dir)
        have_some_file = False
        for entry in os.listdir(self.target_root_dir):
            if os.path.isfile('%s/%s' % (self.target_root_dir, entry)):
                have_some_file = True
        if have_some_file:
            print("WARNING: %s is having stray files." % (self.target_root_dir,))
            print("WARNING: The contents of this directory would be overwritten")

    def generate_msvc(self, msvc_name, options, message):
        os.chdir(self.target_root_dir)
        target_dir = "%s/%s" % (self.target_root_dir, msvc_name)
        try:
            os.makedirs(target_dir)
        except OSError:
            pass
        os.chdir(target_dir)
        cmake_d = self._update_cmaked(options)
        cmake_d.append("-A Win32")
        self._cmake(cmake_d, message)
        return options

    def generate_native(self, msvc_name, options, message):
        os.chdir(self.target_root_dir)
        target_dir = "%s/%s" % (self.target_root_dir, msvc_name)
        try:
            os.makedirs(target_dir)
        except OSError:
            pass
        os.chdir(target_dir)
        if os.path.exists("/usr/local/ssl"):
            print("INFO: Using OPENSSL from '/usr/local/ssl'")
            options["OPENSSL_ROOT_DIR"] = "/usr/local/ssl"
        cmake_d = self._update_cmaked(options)
        if self.akm_native_is_setup():
            cmake_d.append("-Wno-dev")
        self._cmake(cmake_d, message)
        return options

    def generate_eclipse(self, eclipse_name, options, message):
        os.chdir(self.target_root_dir)
        target_dir = "%s/%s-%s" % (self.target_root_dir,
                                   os.path.basename(self.source_root_dir),
                                   eclipse_name)
        try:
            os.makedirs(target_dir)
        except OSError:
            pass
        os.chdir(target_dir)
        generator = "Eclipse CDT4 - Unix Makefiles"
        values = {
            "CMAKE_ECLIPSE_VERSION": "4.5 (Mars)",
            "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        }
        cmake_d = self._update_cmaked(values, options)
        cmake_d.append("-G \"%s\"" % (generator,))
        self._cmake(cmake_d, message)
        return options

    def generate_sublime(self, sublime_name, options, message):
        os.chdir(self.target_root_dir)
        target_dir = "%s/%s" % (self.target_root_dir, sublime_name)
        try:
            os.makedirs(target_dir)
        except OSError:
            pass
        os.chdir(target_dir)
        generator = "Sublime Text 2 - Unix Makefiles"
        values = {
            "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        }
        if os.path.exists(NINJA_EXE):
            values["CMAKE_MAKE_PROGRAM"] = NINJA_EXE
        cmake_d = self._update_cmaked(values, options)
        cmake_d.append("-G \"%s\"" % (generator,))
        self._cmake(cmake_d, message)
        return options

    def generate_xcode(self, xcode_name, options, message):
        os.chdir(self.target_root_dir)
        target_dir = "%s/%s" % (self.target_root_dir, xcode_name)
        try:
            os.makedirs(target_dir)
        except OSError:
            pass
        os.chdir(target_dir)
        values = {
            "Host": "Darwin",
        }
        generator = "Xcode"
        cmake_d = self._update_cmaked(values, options)
        cmake_d.append("-G \"%s\"" % (generator,))
        self._cmake(cmake_d, message)
        return options

    def generate_win10_iot(self, name, options, message):
        os.chdir(self.target_root_dir)
        target_dir = "%s/%s-Win10IoT-%s" % (self.target_root_dir,
                                            os.path.basename(self.source_root_dir),
                                            name)
        try:
            os.makedirs(target_dir)
        except OSError:
            pass
        os.chdir(target_dir)
        values = {
            "Host": "Win10IoT",
            "CMAKE_SYSTEM_NAME": "WindowsStore",
            "CMAKE_SYSTEM_VERSION": "10.0",
            "OpenSSL": "1_0_2",
            "HostCrypto": "OPENSSL",
        }
        cmake_d = self._update_cmaked(values, options)
        generator = "Visual Studio 15 2017"
        cmake_d.append("-G \"%s\"" % (generator,))
        cmake_d.append("-A ARM64")
        self._cmake(cmake_d, message)
        return options

    def _create_edit_cache(self, cmake_d):
        if 'nt' == os.name:  # pylint: disable=misplaced-comparison-constant
            with open("_cmake_editcache.bat", "w") as ec:
                ec.write("cd /d %~dp0\n")
                cmake_gui = self.cmake_exe.replace(".exe", "-gui.exe")
                if cmake_gui == "cmake":
                    cmake_gui = "cmake-gui.exe"
                ec.write("call %s .\n" % (cmake_gui,))
                ec.write("pause\n" % ())
            with open("_cmake_here.bat", "w") as ec:
                ec.write("cd /d %~dp0\n")
                ec.write("call %s . .\n" % (self.cmake_exe,))
            with open("_cmake_build.bat", "w") as ec:
                ec.write("cd /d %~dp0\n")
                ec.write("call %s --build .\n" % (self.cmake_exe,))
                ec.write("pause\n" % ())
            with open("_cmake_createnew.bat", "w") as ec:
                ec.write("cd /d %~dp0\n")
                ec.write("call %s %s %s\n" % (self.cmake_exe, " ".join(cmake_d),
                                              self.source_root_dir))
                ec.write("pause\n" % ())

        elif 'darwin' in sys.platform:
            with open("_cmake_editcache.sh", "w") as ec:
                ec.write("#!/bin/sh\n")
                ec.write("cd %s\n" % (os.path.abspath(os.curdir),))
                ec.write("ccmake .\n")
                ec.write("cmake-gui .\n")
            with open("_cmake_build.sh", "w") as ec:
                ec.write("#!/bin/sh\n")
                ec.write("cd %s\n" % (os.path.abspath(os.curdir),))
                ec.write("cmake --build .\n" % ())
            with open("_cmake_createnew.sh", "w") as ec:
                ec.write("#!/bin/sh\n")
                ec.write("call %s %s %s\n" % (self.cmake_exe, " ".join(cmake_d),
                                              self.source_root_dir))
            for i in ("_cmake_editcache.sh", "_cmake_build.sh", "_cmake_createnew.sh"):
                st = os.stat(i)
                os.chmod(i, st.st_mode | stat.S_IEXEC)
        else:
            pass
            # TODO Shell script that supports cmake-gui and ccmake # pylint: disable=fixme

    def _cmake(self, cmake_d, message):
        if self.is_internal():
            cmake_d.append("-DNXPInternal=OFF")
        print("\n")
        print("### %s" % (message,))
        print("#cmake %s" % (" ".join(cmake_d),))
        self._create_edit_cache(cmake_d)
        os.system("%s %s %s" % (
            self.cmake_exe, " ".join(cmake_d), self.source_root_dir))

    def is_internal(self):
        if os.path.exists("%s/scripts/jenkins/cmake_options_check.groovy" % (
                self.source_root_dir,)):
            return True
        return False

    def is_with_el2go(self):
        if os.path.exists("%s/nxp_iot_agent/src/nxp_iot_agent.c" % (
                self.source_root_dir,)):
            return True
        return False

    def have_opcua_open62541(self):
        if os.path.exists("%s/ext/open62541/LICENSE" % (self.source_root_dir,)):
            return True
        return False

    @classmethod
    def _update_cmaked(cls, values=None, options=None):
        cmake_d = []
        value_and_options = {}
        for the_dict in (values, options):
            if the_dict:
                for k, v in list(the_dict.items()):
                    value_and_options[k] = v

        if cls.is_jenkins():
            if 'CMAKE_BUILD_TYPE' in list(value_and_options.keys()):
                pass
            else:
                value_and_options['CMAKE_BUILD_TYPE'] = "Debug"
        else:
            value_and_options['CMAKE_BUILD_TYPE'] = "Debug"
        for k, v in list(value_and_options.items()):
            if " " in v:
                cmake_d.append("-D%s=\"%s\"" % (k, v))
            else:
                cmake_d.append("-D%s=%s" % (k, v))
        return cmake_d

    @classmethod
    def vs_env_is_setup(cls):
        VSINSTALLDIR = os.getenv("VSINSTALLDIR")
        return bool(VSINSTALLDIR and os.path.exists(VSINSTALLDIR))

    @classmethod
    def is_visual_studio_installed(cls):
        VS140COMNTOOLS = os.getenv("VS140COMNTOOLS")
        VS120COMNTOOLS = os.getenv("VS120COMNTOOLS")
        if VS140COMNTOOLS and os.path.exists(VS140COMNTOOLS):
            return True
        if VS120COMNTOOLS and os.path.exists(VS120COMNTOOLS):
            return True
        if os.path.exists(r"C:\Program Files (x86)\Microsoft Visual Studio\2017"):
            return True
        if os.path.exists(r"C:\Program Files (x86)\Microsoft Visual Studio\2019"):
            return True

        return False

    @classmethod
    def mcux_env_is_setup(cls):
        ARMGCC_DIR = os.getenv("ARMGCC_DIR")
        return bool(ARMGCC_DIR and os.path.exists(ARMGCC_DIR))

    @classmethod
    def imx_cross_compilation(cls):
        PKG_CONFIG_SYSROOT_DIR = os.getenv("PKG_CONFIG_SYSROOT_DIR")
        return bool(PKG_CONFIG_SYSROOT_DIR and os.path.exists(PKG_CONFIG_SYSROOT_DIR))

    @classmethod
    def imx_native_compilation(cls):
        if 'imx6' in platform.node():
            return True
        if 'imx8' in platform.node():
            return True
        return False

    @classmethod
    def win10_iot_compilation(cls):
        if os.path.exists(
                r"C:\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\runtime."
                r"win10-arm.microsoft.net.native.compiler"):
            return True
        return False

    @classmethod
    def rasp_pi_native_compilation(cls):
        return bool('raspberrypi' in platform.node())

    @classmethod
    def akm_native_is_setup(cls):
        ANDROID_NDK_ROOT = os.getenv("ANDROID_NDK_ROOT")
        return bool(ANDROID_NDK_ROOT and os.path.exists(ANDROID_NDK_ROOT))

    @classmethod
    def ninja_is_setup(cls):
        if os.path.exists(NINJA_EXE):
            return True
        return False

    @classmethod
    def is_jenkins(cls):
        if 'JENKINS_URL' in list(os.environ.keys()):
            return True
        return False

    @classmethod
    def is_cygwin(cls):
        return bool("CYGWIN" in platform.system().upper() and "posix" == os.name)  # pylint: disable=misplaced-comparison-constant

    @classmethod
    def suggest_how_to_setup_env(cls):
        env_keys = set(os.environ.keys())
        needed_command = None
        for vs_num in range(20, 9, -1):
            vscommontools = "VS%d0COMNTOOLS" % (vs_num,)
            if vscommontools in env_keys:
                if not needed_command:
                    needed_command = 'call "%%%s%%vsvars32.bat"' % (vscommontools,)
                    break
        if needed_command:
            print("Before running this script, run this command:\n    %s" % (needed_command,))

    def create_opcua_open62541_files(self):
        open62541 = "%s/ext/open62541" % self.source_root_dir
        gen_dir = "%s/build/src_generated/open62541" % open62541
        if not os.path.exists(gen_dir):
            os.makedirs(gen_dir)
        os.system((""
                   + "%s "
                   + "%s/tools/generate_datatypes.py --namespace=0 "
                   + "--selected-types=%s/tools/schema/datatypes_minimal.txt "
                   + "--selected-types=%s/tools/schema/datatypes_method.txt "
                   + "--selected-types=%s/tools/schema/datatypes_subscriptions.txt "
                   + "--selected-types=%s/tools/schema/datatypes_discovery.txt "
                   + "--selected-types=%s/tools/schema/datatypes_dataaccess.txt "
                   + "--selected-types=%s/tools/schema/datatypes_typedescription.txt "
                   + "--type-bsd=%s/tools/schema/Opc.Ua.Types.bsd "
                   + "--type-csv=%s/tools/schema/NodeIds.csv "
                   + "%s/types")
                  % (sys.executable, open62541, open62541, open62541, open62541,
                     open62541, open62541, open62541, open62541, open62541,
                     gen_dir))
        os.system((""
                   + "%s "
                   + "%s/tools/generate_datatypes.py --namespace=1 "
                   + "--selected-types=%s/tools/schema/datatypes_transport.txt "
                   + "--type-bsd=%s/tools/schema/Opc.Ua.Types.bsd "
                   + "--type-bsd=%s/tools/schema/Custom.Opc.Ua.Transport.bsd "
                   + "--type-csv=%s/tools/schema/NodeIds.csv "
                   + "--no-builtin --internal "
                   + "%s/transport")
                  % (sys.executable, open62541, open62541, open62541, open62541,
                     open62541, gen_dir))
        os.system((""
                   + "%s "
                   + "%s/tools/generate_statuscode_descriptions.py "
                   + "%s/tools/schema/StatusCode.csv "
                   + "%s/statuscodes")
                  % (sys.executable, open62541, open62541, gen_dir))
        os.system((""
                   + "%s "
                   + "%s/tools/generate_nodeid_header.py "
                   + "%s/tools/schema/NodeIds.csv "
                   + "%s/nodeids NS0")
                  % (sys.executable, open62541, open62541, gen_dir))
        os.system((""
                   + "%s "
                   + "%s/tools/nodeset_compiler/nodeset_compiler.py --internal-headers "
                   + "--ignore=%s/tools/nodeset_compiler/NodeID_NS0_Base.txt "
                   + "--xml=%s/tools/schema/Opc.Ua.NodeSet2.Minimal.xml "
                   + "%s/namespace0_generated")
                  % (sys.executable, open62541, open62541, open62541, gen_dir))


def main():  # pylint: disable=too-many-statements, too-many-branches
    try:
        CMAKE_EXE = os.environ['CMAKE_DIR'] + "\\cmake.exe"
    except KeyError:
        CMAKE_EXE = "cmake.exe"

    if 'nt' == os.name:  # pylint: disable=misplaced-comparison-constant
        if os.path.exists(CMAKE_EXE):
            pass
        elif os.path.exists(r"C:\opt\cmake\bin\cmake.exe"):
            CMAKE_EXE = r"C:\opt\cmake\bin\cmake.exe"

        if os.path.exists(CMAKE_EXE):
            pass
        elif os.path.exists(r"C:\Program Files (x86)\cmake\bin\cmake.exe"):
            CMAKE_EXE = r"C:\Program Files (x86)\cmake\bin\cmake.exe"

        if os.path.exists(CMAKE_EXE):
            pass
        else:
            print("Could not find '%s'. Assuming 'cmake.exe' is in path and running." %
                  (CMAKE_EXE,))
            CMAKE_EXE = 'cmake'
    else:
        CMAKE_EXE = "cmake"

    # in case we are running from any arbitary directory, switch to this
    # directory.
    root_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..")

    gc = CMakeGenertor(CMAKE_EXE, root_dir)
    Host = ""
    if os.name == 'nt':
        Host = "PCWindows"
    elif gc.is_cygwin():
        Host = "Cygwin"
    elif "linux" in sys.platform:
        if gc.is_jenkins():
            Host = "PCLinux32"
        else:
            Host = "PCLinux64"
    elif 'darwin' in sys.platform:
        Host = "Darwin"

    if gc.have_opcua_open62541():
        gc.create_opcua_open62541_files()

    if 'nt' == os.name:  # pylint: disable=misplaced-comparison-constant
        if gc.is_visual_studio_installed() or gc.vs_env_is_setup():
            e = gc.generate_msvc("se_x86", {
                "Applet": "SE05X_C",
                "Host": Host,
                "HostCrypto": "MBEDTLS",
            }, "Connect to Secure Element from PC")
            if gc.is_internal():
                e["WithDllSupport"] = "ON"
                e["Applet"] = "None"
                e["SMCOM"] = "None"
                e = gc.generate_msvc("mbed_x86", e,
                                     "Pure SW Implementaiton with medTLS")
                e["HostCrypto"] = "OPENSSL"
                e = gc.generate_msvc("openssl_x86", e,
                                     "Pure SW Implementaiton with OpenSSL")

    if gc.is_internal():
        gc.generate_eclipse("eclipse_x86", {
            "Host": Host,
            "HostCrypto": "MBEDTLS",
            "Applet": "None",
            "SMCOM": "None",
        }, "Pure SW Implementaiton with Eclipse IDE")
    if gc.is_jenkins():
        gc.generate_eclipse("eclipse_openssl", {
            "Host": "PCLinux32",
            "HostCrypto": "OPENSSL",
            "Applet": "None",
            "SMCOM": "None",
        }, "Pure SW Implementaiton with Eclipse IDE and OpenSSL")

    if gc.mcux_env_is_setup():
        arm = gc.generate_eclipse("eclipse_arm", {
            "CMAKE_TOOLCHAIN_FILE": root_dir + "/scripts/armgcc_force_cpp.cmake",
            "Applet": "SE05X_C",
            "Host": "frdmk64f",
            "SMCOM": "T1oI2C"
        }, "Cross compilation setup with Eclipse")
        # LPC55S Secure and Non-secure projects
        arm["Host"] = "lpcxpresso55s_ns"
        arm = gc.generate_eclipse("eclipse_ns", arm,
                                  "Cross compilation setup - Non Secure world")
        arm["Host"] = "lpcxpresso55s_s"
        arm = gc.generate_eclipse("eclipse_s", arm,
                                  "Cross compilation setup - Secure World")

    if 'darwin' in sys.platform:
        e = gc.generate_xcode("xcode", {
            "Applet": "SE05X_C",
            "Host": "Darwin",
            "SMCOM": "JRCP_V2",
        }, "XCode project on OS X")
        if gc.is_internal():
            gc.generate_sublime("sublime_arm", {
                "CMAKE_TOOLCHAIN_FILE": root_dir + "/scripts/armgcc_force_cpp.cmake",
                "Applet": "SE05X_C",
                "Host": "frdmk64f",
                "SMCOM": "T1oI2C",
            }, "Usign sublime")

    if gc.imx_cross_compilation():
        e = gc.generate_native("imx_cc_a7x_sci2c", {
            "CMAKE_TOOLCHAIN_FILE": root_dir + "/scripts/ToolchainFile_imx6.cmake",
            "Applet": "A71CH",
            "HostCrypto": "OPENSSL",
            "Host": "iMXLinux",
            "SMCOM": "SCI2C",
        }, "Cross compiled for A71CH using SCI2C")
        e["SMCOM"] = "T1oI2C"
        e["Applet"] = "SE05X_C"
        gc.generate_native("imx_cc_se050_t1oi2c", e,
                           "Cross compiled for SE05x using T=1 over I2C")
    if gc.imx_native_compilation():
        e = gc.generate_native("imx_native_a7x_sci2c", {
            "Applet": "A71CH",
            "SE05X_Auth": "None",
            "HostCrypto": "OPENSSL",
            "Host": "iMXLinux",
            "SMCOM": "SCI2C",
            "WithSharedLIB": "ON",
        }, "Native compilation on iMX Linux for A71CH using SCI2C")
        e["SMCOM"] = "T1oI2C"
        e["Applet"] = "SE05X_C"
        if gc.is_internal():
            e["SE05X_Auth"] = "UserID"
        e["SCP"] = "SCP03_SSS"
        gc.generate_native("imx_native_se050_t1oi2c", e,
                           "Native compilation on iMX Linux for SE05X using T=1 Over I2C")

    if gc.akm_native_is_setup():
        NDK_ROOT = os.getenv("ANDROID_NDK_ROOT")
        e = gc.generate_native("android_arm64", {
            "ANDROID_NDK": NDK_ROOT,
            "ANDROID_ABI": "arm64-v8a",
            "ANDROID_PLATFORM": "android-27",
            "ANDROID_STL": "c++_static",
            "LOCAL_CFLAGS": "HAVE_PTHREADS",
            "CMAKE_TOOLCHAIN_FILE": NDK_ROOT + "/build/cmake/android.toolchain.cmake",
            "Applet": "SE05X_C",
            "HostCrypto": "MBEDTLS",
            "Host": "Android",
            "SMCOM": "T1oI2C",
        }, "Android 64bit compilation")
        e["ANDROID_ABI"] = "armeabi-v7a"

        gc.generate_native("android_arm", e,
                           "Android 32bit compilation")

    if "linux" in sys.platform:
        if gc.imx_native_compilation() or gc.rasp_pi_native_compilation():
            # Is linux, but there we don't use SM COM = JRCP V1
            pass
        else:
            gc.generate_eclipse("eclipse_jrcpv1", {
                "Applet": "SE05X_C",
                "Host": Host,
                "SMCOM": "JRCP_V1"
            }, "JRCP V1 on Linux")

    if False and gc.ninja_is_setup():
        gc.generate_sublime("subl_x86", {
            "Applet": "SE05X_C",
            "HostCrypto": "MBEDTLS",
            "Host": Host,
            "SMCOM": "None",
        }, "Using sublime")

    if gc.rasp_pi_native_compilation():
        e = gc.generate_native("raspbian_native_se050_t1oi2c", {
            "Applet": "SE05X_C",
            "HostCrypto": "OPENSSL",
            "Host": "Raspbian",
            "SMCOM": "T1oI2C",
            "SCP": "SCP03_SSS",
            "WithSharedLIB": "ON",
        }, "Using Raspberry PI")

    # i.MX6UL/ULL and i.MX8M Mini EVK
    if gc.imx_native_compilation() and gc.is_with_el2go():
        e = gc.generate_native("imx_native_se050_t1oi2c_openssl_el2go", {
            "Applet": "SE05X_C",
            "SE05X_Auth": "None",
            "SCP": "None",
            "HostCrypto": "OPENSSL",
            "Host": "iMXLinux",
            "SMCOM": "T1oI2C",
            "WithSharedLIB": "ON",
        }, "Native compilation on iMX Linux for SE05X using T=1 Over I2C "
           "for EdgeLock 2GO")

    # KSDK K64F
    if gc.mcux_env_is_setup() and gc.is_with_el2go():
        arm = gc.generate_eclipse("eclipse_arm_el2go", {
            "CMAKE_TOOLCHAIN_FILE": root_dir + "/scripts/armgcc_force_cpp.cmake",
            "Applet": "SE05X_C",
            "SE05X_Auth": "None",
            "SCP": "None",
            "Host": "frdmk64f",
            "SMCOM": "T1oI2C",
            "RTOS": "FreeRTOS",
            "HostCrypto": "MBEDTLS",
            "mbedTLS_ALT": "SSS"
        }, "Cross compilation setup with Eclipse for EdgeLock 2GO")


if __name__ == "__main__":
    main()
