/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
apply plugin: 'org.openapi.generator'
description = 'Fineract Client'

apply from: 'dependencies.gradle'

// TODO: @vidakovic we should publish this lib to Maven Central; do in separate PR

openApiMeta {
    generatorName = 'Fineract'
    packageName = 'org.apache.fineract.client'
    outputFolder = "$buildDir/meta".toString()
    // trick to make sure fineract.json is generated first
}

openApiValidate {
    inputSpec = "file:///$swaggerFile"
    recommend = true
}

task buildJavaSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) {
    generatorName = 'java'
    verbose = false
    validateSpec = false
    skipValidateSpec = true
    inputSpec = "file:///$swaggerFile"
    outputDir = "$buildDir/generated/temp-java".toString()
    templateDir = "$projectDir/src/main/resources/templates/java"
    groupId = 'org.apache.fineract'
    apiPackage = 'org.apache.fineract.client.services'
    invokerPackage = 'org.apache.fineract.client'
    modelPackage = 'org.apache.fineract.client.models'
    configOptions = [
        dateLibrary: 'java8',
        useRxJava2: 'false',
        library: 'retrofit2',
        hideGenerationTimestamp: 'true',
    ]
    generateModelTests = false
    generateApiTests = false
    ignoreFileOverride = "$projectDir/.openapi-generator-ignore"
    dependsOn(':fineract-provider:resolve')
}

task buildTypescriptAngularSdk(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
    generatorName = 'typescript-angular'
    verbose = false
    validateSpec = false
    skipValidateSpec = true
    inputSpec = "file:///$swaggerFile"
    outputDir = "$buildDir/generated/typescript".toString()
    apiPackage = 'apache-fineract-client/services'
    invokerPackage = 'apache-fineract-client/invoker'
    modelPackage = 'apache-fineract-client/models'
    configOptions = [
        apiModulePrefix: 'apacheFineractClient',
        configurationPrefix: 'apacheFineractClient',
        ngVersion: '12.0.0',
        npmName: '@apache/fineract-client',
        npmRepository: "${npmRepository}"
    ]
    dependsOn(':fineract-provider:resolve')
}

task buildAsciidoc(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
    generatorName = 'asciidoc'
    verbose = false
    validateSpec = false
    skipValidateSpec = true
    inputSpec = "file:///$swaggerFile"
    outputDir = "$buildDir/generated/asciidoc".toString()
    apiPackage = 'org.apache.fineract.client.services'
    invokerPackage = 'org.apache.fineract.client'
    modelPackage = 'org.apache.fineract.client.models'
    configOptions = [
        appName: 'Apache Fineract REST API',
        appDescription: '''Apache Fineract is a secure, multi-tenanted microfinance platform.
            The goal of the Apache Fineract API is to empower developers to build apps on top of the Apache Fineract Platform.
            The https://cui.fineract.dev[reference app] (username: mifos, password: password) works on the same demo tenant as the interactive links in this documentation.
            Until we complete the new REST API documentation you still have the legacy documentation available https://fineract.apache.org/legacy-docs/apiLive.htm[here].
            Please check https://fineract.apache.org/docs/current[the Fineract documentation] for more information.''',
        headerAttributes: 'false',
        infoEmail: 'dev@fineract.apache.org',
        infoUrl: 'https://fineract.apache.org',
        licenseInfo: 'Apache 2.0',
        licenseUrl: 'http://www.apache.org/licenses/LICENSE-2.0.html',
        useMethodAndPath: 'true'
    ]
    dependsOn(':fineract-provider:resolve')
}

task cleanupGeneratedJavaFiles() {
    doLast {
        copy {
            from "$buildDir/generated/temp-java".toString()
            into "$buildDir/generated/java".toString()
            filter { line ->
                line
                        // This is a temporary step to get rid of joda imports in the generated code
                        // At this point it's unknown why it's even generated, probably it's a bug in the generator
                        .replaceAll("import org\\.joda\\.time\\.\\*;", "")
                        // The 3 lines below handles the cases when a request body is not required
                        .replaceAll(", \\)", ")")
                        .replaceAll(", , @HeaderMap", ", @HeaderMap")
                        .replaceAll("\\(, ", "(")
            }
        }
    }

    dependsOn("buildJavaSdk")
}

// TODO: @vidakovic we could provide even more client libs in different languages (Go, Ruby, Swift etc.)
compileJava.dependsOn(buildJavaSdk, buildTypescriptAngularSdk, buildAsciidoc, cleanupGeneratedJavaFiles, licenseFormatMain, spotlessMiscApply)

java {
    // keep this at Java 8, not 17; see https://issues.apache.org/jira/browse/FINERACT-1214
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

tasks.withType(JavaCompile) {
    // the generated code in build/generated/java/src/main/java/org/apache/fineract/client/auth/OAuthOkHttpClient.java#L71 currently uses deprecated RequestBody.create(MediaType,String)
    // TODO FINERACT-1247 why does this not work:
    //   options.compilerArgs -= ["-Xlint:deprecation"]
    //   options.compilerArgs += ["-Xlint:-deprecation"]
    // So we just have to use:
    options.compilerArgs -= ["-Werror"]
}

configurations {
    generatedCompileClasspath.extendsFrom implementation
    generatedRuntimeClasspath.extendsFrom runtimeClasspath
}

test {
    useJUnitPlatform()
}

sourceSets.main.java.srcDir new File(buildDir, "generated/java/src/main/java")

// NOTE: Gradle suggested these dependencies
licenseFormatMain.dependsOn buildJavaSdk
licenseMain.dependsOn licenseFormatMain
