import java.nio.file.Paths

// General gradle arguments for root project
buildscript {    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        //
        // https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
        //
        // Notice that 4.0.0 here is the version of [Android Gradle Plugin]
        // Accroding to URL above you will need Gradle 6.1 or higher
        //
        classpath "com.android.tools.build:gradle:4.1.1"
    }
}
repositories {
    google()
    jcenter()
}

// Project's root where CMakeLists.txt exists: rootDir/support/.cxx -> rootDir
def rootDir = Paths.get(project.buildDir.getParent()).getParent()
println("rootDir: ${rootDir}")

// Output: Shared library (.so) for Android 
apply plugin: "com.android.library"
android {
    compileSdkVersion 25    // Android 7.0

    // Target ABI
    //  - This option controls target platform of module
    //  - The platform might be limited by compiler's support
    //    some can work with Clang(default), but some can work only with GCC...
    //    if bad, both toolchains might not support it
    splits {
        abi {
            enable true
            // Specify platforms for Application
            reset()
            include  "arm64-v8a", "armeabi-v7a", "x86_64"
        }
    }
    ndkVersion "21.3.6528147" // ANDROID_NDK_HOME is deprecated. Be explicit

    defaultConfig {
        minSdkVersion 21    // Android 5.0+
        targetSdkVersion 25 // Follow Compile SDK
        versionCode 34      // Follow release count
        versionName "7.1.2" // Follow Official version
        
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"    // Specify Android STL
                arguments "-DBUILD_SHARED_LIBS=true"    // Build shared object
                arguments "-DFMT_TEST=false"            // Skip test
                arguments "-DFMT_DOC=false"             // Skip document
                cppFlags  "-std=c++17"
                targets   "fmt"
            }
        }
        println(externalNativeBuild.cmake.cppFlags)
        println(externalNativeBuild.cmake.arguments)
    }

    // External Native build
    //  - Use existing CMakeList.txt
    //  - Give path to CMake. This gradle file should be 
    //    neighbor of the top level cmake
    externalNativeBuild {
        cmake {
            version "3.10.0+"
            path "${rootDir}/CMakeLists.txt"
            // buildStagingDirectory "./build"  // Custom path for cmake output
        }
    }
    
    sourceSets{
        // Android Manifest for Gradle
        main {
            manifest.srcFile "AndroidManifest.xml"
        }
    }

    // https://developer.android.com/studio/build/native-dependencies#build_system_configuration
    buildFeatures {
        prefab true
        prefabPublishing true
    }
    prefab {
        fmt {
            headers "${rootDir}/include"
        }
    }
}

assemble.doLast
{
    // Instead of `ninja install`, Gradle will deploy the files.
    // We are doing this since FMT is dependent to the ANDROID_STL after build
    copy {
        from "build/intermediates/cmake"
        into "${rootDir}/libs"
    }
    // Copy debug binaries
    copy {
        from "${rootDir}/libs/debug/obj"
        into "${rootDir}/libs/debug"
    }
    // Copy Release binaries
    copy {
        from "${rootDir}/libs/release/obj"
        into "${rootDir}/libs/release"
    }
    // Remove empty directory
    delete "${rootDir}/libs/debug/obj"
    delete "${rootDir}/libs/release/obj"

    // Copy AAR files. Notice that the aar is named after the folder of this script.
    copy {
        from "build/outputs/aar/support-release.aar"
        into "${rootDir}/libs"
        rename "support-release.aar", "fmt-release.aar"
    }
    copy {
        from "build/outputs/aar/support-debug.aar"
        into "${rootDir}/libs"
        rename "support-debug.aar", "fmt-debug.aar"
    }
}
