#!/usr/bin/env python

import sys

Import("env")

android_files = [
    "os_android.cpp",
    "android_input_handler.cpp",
    "file_access_android.cpp",
    "file_access_filesystem_jandroid.cpp",
    "audio_driver_opensl.cpp",
    "dir_access_jandroid.cpp",
    "tts_android.cpp",
    "thread_jandroid.cpp",
    "net_socket_android.cpp",
    "java_pandemonium_lib_jni.cpp",
    "java_class_wrapper.cpp",
    "java_pandemonium_wrapper.cpp",
    "java_pandemonium_io_wrapper.cpp",
    "java_pandemonium_view_wrapper.cpp",
    "jni_utils.cpp",
    "android_keys_utils.cpp",
    "plugin/pandemonium_plugin_jni.cpp",
    "platform_thread.cpp",
]

env_android = env.Clone()

android_objects = []
for x in android_files:
    android_objects.append(env_android.SharedObject(x))

env_thirdparty = env_android.Clone()
env_thirdparty.disable_warnings()
thirdparty_obj = env_thirdparty.SharedObject("#thirdparty/misc/ifaddrs-android.cc")
android_objects.append(thirdparty_obj)

lib = env_android.add_shared_library("#bin/libpandemonium", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"])

# Needed to force rebuilding the platform files when the thirdparty code is updated.
env.Depends(lib, thirdparty_obj)

def get_min_sdk_version(platform):
    return int(platform.split("-")[1])

android_platform_abi_name = ""

if env["android_arch"] == "armv7":
    android_platform_abi_name = "armeabi-v7a"
elif env["android_arch"] == "arm64v8":
    android_platform_abi_name = "arm64-v8a"
elif env["android_arch"] == "x86":
    android_platform_abi_name = "x86"
elif env["android_arch"] == "x86_64":
    android_platform_abi_name = "x86_64"
else:
    print("WARN: Unknown android platform abi name!")

lib_arch_dir = ""

# in NDK27 there is also a riscv platofrm (riscv64-linux-android). TODO
if get_min_sdk_version(env["ndk_platform"]) >= 25:
    if env["android_arch"] == "armv7":
        lib_arch_dir = "arm-linux-androideabi"
    elif env["android_arch"] == "arm64v8":
        lib_arch_dir = "aarch64-linux-android"
    elif env["android_arch"] == "x86":
        lib_arch_dir = "i686-linux-android"
    elif env["android_arch"] == "x86_64":
        lib_arch_dir = "x86_64-linux-android"
    else:
        print("WARN: Architecture not suitable for embedding into APK; keeping .so at \\bin")
else:
    if env["android_arch"] == "armv7":
        lib_arch_dir = "armeabi-v7a"
    elif env["android_arch"] == "arm64v8":
        lib_arch_dir = "arm64-v8a"
    elif env["android_arch"] == "x86":
        lib_arch_dir = "x86"
    elif env["android_arch"] == "x86_64":
        lib_arch_dir = "x86_64"
    else:
        print("WARN: Architecture not suitable for embedding into APK; keeping .so at \\bin")

if lib_arch_dir != "":
    if env["target"] == "release":
        lib_type_dir = "release"
    elif env["target"] == "release_debug":
        lib_type_dir = "debug"
    else:  # debug
        lib_type_dir = "dev"

    lib_tools_dir = ""

    if env["tools"]:
        lib_tools_dir = "tools/"

    out_dir = "#platform/android/java/lib/libs/" + lib_tools_dir + lib_type_dir + "/" + android_platform_abi_name 
    env_android.Command(
        out_dir + "/libpandemonium_android.so", "#bin/libpandemonium" + env["SHLIBSUFFIX"], Move("$TARGET", "$SOURCE")
    )

    stl_lib_path = ""

    # NDK25 changed where the libraries are stored.
    # They also dropped 32 bit windows support. (Likely earlier)
    if get_min_sdk_version(env["ndk_platform"]) >= 25:
        host_subpath = ""

        if sys.platform.startswith("linux"):
            host_subpath = "linux-x86_64"
        elif sys.platform.startswith("darwin"):
            host_subpath = "darwin-x86_64"
        elif sys.platform.startswith("win"):
            host_subpath = "windows-x86_64"

        if host_subpath == "":
            print("Warning: Host architecture is not suitable to building for android! Toolchain does no exists.")

        stl_lib_path = (
            str(env["ANDROID_NDK_ROOT"]) + "/toolchains/llvm/prebuilt/" + host_subpath + "/sysroot/usr/lib/" + lib_arch_dir + "/libc++_shared.so"
        )

    else:
        stl_lib_path = (
            str(env["ANDROID_NDK_ROOT"]) + "/sources/cxx-stl/llvm-libc++/libs/" + lib_arch_dir + "/libc++_shared.so"
        )

    env_android.Command(out_dir + "/libc++_shared.so", stl_lib_path, Copy("$TARGET", "$SOURCE"))

