/**
 * 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.
 */
description = 'Fineract Client'

apply plugin: 'org.openapi.generator'

apply from: 'dependencies.gradle'

// enable when all tests are migrated
tasks.cucumber.onlyIf {false}

// 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.yaml 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/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')
}

// TODO: @vidakovic we could provide even more client libs in different languages (Go, Ruby, Swift etc.)
compileJava.dependsOn(buildJavaSdk, buildTypescriptAngularSdk, buildAsciidoc, 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 buildJavaSdk
