import com.android.ndkports.AdHocPortTask
import com.android.ndkports.AndroidExecutableTestTask
import com.android.ndkports.CMakeCompatibleVersion

fun openSslVersionToCMakeVersion(openSslVersion: String): CMakeCompatibleVersion {
    val (major, minor, microAndLetter) = openSslVersion.split(".")
    val letter = microAndLetter.last()
    val micro = microAndLetter.substringBefore(letter)
    val tweak = if (letter.isDigit()) {
        // 1.1.1 is 1.1.1.0.
        0
    } else {
        // 1.1.1a is 1.1.1.1.
        letter.toInt() - 'a'.toInt() + 1
    }

    return CMakeCompatibleVersion(
        major.toInt(), minor.toInt(), micro.toInt(), tweak
    )
}

val portVersion = "1.1.1l"
val prefabVersion = openSslVersionToCMakeVersion(portVersion)

group = "com.android.ndk.thirdparty"
version = "$portVersion${rootProject.extra.get("snapshotSuffix")}"

plugins {
    id("maven-publish")
    id("com.android.ndkports.NdkPorts")
}

ndkPorts {
    ndkPath.set(File(project.findProperty("ndkPath") as String))
    source.set(project.file("src.tar.gz"))
    minSdkVersion.set(16)
}

val buildTask = tasks.register<AdHocPortTask>("buildPort") {
    builder {
        run {
            args(
                sourceDirectory.resolve("Configure").absolutePath,
                "android-${toolchain.abi.archName}",
                "-D__ANDROID_API__=${toolchain.api}",
                "--prefix=${installDirectory.absolutePath}",
                "--openssldir=${installDirectory.absolutePath}",
                "no-sctp",
                "shared"
            )

            env("ANDROID_NDK", toolchain.ndk.path.absolutePath)
            env("PATH", "${toolchain.binDir}:${System.getenv("PATH")}")
        }

        run {
            args("make", "-j$ncpus", "SHLIB_EXT=.so")

            env("ANDROID_NDK", toolchain.ndk.path.absolutePath)
            env("PATH", "${toolchain.binDir}:${System.getenv("PATH")}")
        }

        run {
            args("make", "install_sw", "SHLIB_EXT=.so")

            env("ANDROID_NDK", toolchain.ndk.path.absolutePath)
            env("PATH", "${toolchain.binDir}:${System.getenv("PATH")}")
        }
    }
}

tasks.prefabPackage {
    version.set(prefabVersion)

    modules {
        create("crypto")
        create("ssl")
    }
}

tasks.register<AndroidExecutableTestTask>("test") {
    val srcDir = tasks.extractSrc.get().outDir.asFile.get()
    val testSrc = srcDir.resolve("test/ssl-tests")
    val deviceTestRelPath = File("testconf")

    val unsupportedTests = listOf(
        // This test is empty and appears to just be broken in 1.1.1k.
        "16-certstatus.conf",
        // zlib support is not enabled.
        "22-compression.conf",
        // Android does not support SCTP sockets and this test requires them.
        "29-dtls-sctp-label-bug.conf"
    )

    push {
        val ignoredExtensions = listOf("o", "d")
        val buildDirectory = buildTask.get().buildDirectoryFor(abi)
        push(
            srcDir.resolve("test/ct/log_list.conf"), File("log_list.conf")
        )
        for (file in buildDirectory.walk()) {
            if (!file.isFile) {
                continue
            }

            if (file.extension in ignoredExtensions) {
                continue
            }

            push(file, file.relativeTo(buildDirectory))
        }
        for (file in testSrc.walk()) {
            if (file.extension == "conf") {
                push(
                    file, deviceTestRelPath.resolve(file.relativeTo(testSrc))
                )
            }
        }
        push(srcDir.resolve("test/certs"), File("certs"))
    }

    run {
        // https://github.com/openssl/openssl/blob/master/test/README.ssltest.md
        val sslTest = deviceDirectory.resolve("test/ssl_test")
        val ctlogFile = deviceDirectory.resolve("log_list.conf")
        val testCertDir = deviceDirectory.resolve("certs")
        for (file in testSrc.walk()) {
            val test = deviceDirectory.resolve(deviceTestRelPath)
                .resolve(file.relativeTo(testSrc))
            if (file.extension == "conf" && file.name !in unsupportedTests) {
                shellTest(
                    file.relativeTo(testSrc).toString(), listOf(
                        "LD_LIBRARY_PATH=$deviceDirectory",
                        "CTLOG_FILE=$ctlogFile",
                        "TEST_CERTS_DIR=$testCertDir",
                        sslTest.toString(),
                        test.toString()
                    )
                )
            }
        }
    }
}

publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["prefab"])
            pom {
                name.set("OpenSSL")
                description.set("The ndkports AAR for OpenSSL.")
                url.set(
                    "https://android.googlesource.com/platform/tools/ndkports"
                )
                licenses {
                    license {
                        name.set("Dual OpenSSL and SSLeay License")
                        url.set("https://www.openssl.org/source/license-openssl-ssleay.txt")
                        distribution.set("repo")
                    }
                }
                developers {
                    developer {
                        name.set("The Android Open Source Project")
                    }
                }
                scm {
                    url.set("https://android.googlesource.com/platform/tools/ndkports")
                    connection.set("scm:git:https://android.googlesource.com/platform/tools/ndkports")
                }
            }
        }
    }

    repositories {
        maven {
            url = uri("${rootProject.buildDir}/repository")
        }
    }
}
