defaultTasks("run")

repositories {
    mavenCentral()
}

tasks.register<Exec>("run-db") {
    group = "OpenCoDE"
    description = "Runs the database in background via docker"
    commandLine("docker", "compose", "up", "-d", "db")
}

tasks.register<Exec>("run-dashboard") {
    group = "OpenCoDE"
    description = "Runs the dashboard in background via docker."
    workingDir("../dashboard")
    commandLine("docker", "compose", "up", "-d", "dashboard")
}

tasks.register("dependencyUpdates") {
    group = "OpenCODE"
    description = "Prints possible dependency updates."
    dependsOn(gradle.includedBuild("app").task(":backend:dependencyUpdates"))
}

tasks.register("run") {
    group = "OpenCoDE"
    description = "Runs the dataprovider against the database, you should be sure database is running."
    dependsOn(gradle.includedBuild("app").task(":backend:bootRun"))

    // check if db is started and reports healthy
    doFirst {
        val checkHealthCmd = arrayOf("docker", "inspect", "--format='{{.State.Health.Status}}'", "opencode-db-1")
        val process = Runtime.getRuntime().exec(checkHealthCmd)
        val healthStatus = process.inputStream.bufferedReader().readText().trim()

        if (healthStatus != "healthy") {
            throw GradleException("Database container 'opencode-db-1' is not healthy. Please start db first via run-db task. Current db status: \"$healthStatus\" (empty = no db started)")
        }
    }
}

tasks.register<Exec>("run-container") {
    group = "OpenCoDE"
    description = "Runs the dataprovider against the database in foreground."
    commandLine("docker", "compose", "up", "--build", "data-provider")
}

tasks.register("clean") {
    group = "OpenCoDE"
    description = "Removes all builds."
    dependsOn(gradle.includedBuild("app").task(":backend:clean"))
}

tasks.register("build") {
    group = "OpenCoDE"
    description = "Build the service"
    dependsOn(gradle.includedBuild("app").task(":backend:build"))
}

tasks.register("test") {
    group = "OpenCoDE"
    description = "Runs tests."
    dependsOn(gradle.includedBuild("app").task(":backend:test"))
}

tasks.register("assemble") {
    group = "OpenCoDE"
    description = "Assembles everything into a deployable format."
    dependsOn(gradle.includedBuild("app").task(":backend:assemble"))
}