/**
 * 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 Custom Docker Image'

apply plugin: 'java'
apply plugin: 'com.google.cloud.tools.jib'
apply from: "${rootDir}/buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle"

jib {
    from {
        image = 'azul/zulu-openjdk-alpine:17'
    }

    to {
        image = 'fineract-custom'
        tags = [
            "${project.version}",
            'latest'
        ]
    }

    container {
        creationTime = 'USE_CURRENT_TIMESTAMP'
        mainClass = 'org.apache.fineract.ServerApplication'
        jvmFlags = [
            '-Xms1G',
            '-XshowSettings:vm',
            '-XX:+UseContainerSupport',
            '-XX:+UseStringDeduplication',
            '-XX:MinRAMPercentage=25',
            '-XX:MaxRAMPercentage=80',
            '--add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED',
            '--add-opens=java.base/java.lang=ALL-UNNAMED',
            '--add-opens=java.base/java.lang.invoke=ALL-UNNAMED',
            '--add-opens=java.base/java.io=ALL-UNNAMED',
            '--add-opens=java.base/java.security=ALL-UNNAMED',
            '--add-opens=java.base/java.util=ALL-UNNAMED',
            '--add-opens=java.management/javax.management=ALL-UNNAMED',
            '--add-opens=java.naming/javax.naming=ALL-UNNAMED'
        ]
        args = [
            '-Duser.home=/tmp',
            '-Dfile.encoding=UTF-8',
            '-Duser.timezone=UTC',
            '-Djava.security.egd=file:/dev/./urandom'
        ]
        ports = ['8080/tcp', '8443/tcp']
        labels = [maintainer: 'Aleksandar Vidakovic <aleks@apache.org>']
        user = 'nobody:nogroup'
    }

    allowInsecureRegistries = true

    dependencies {
        implementation project(':fineract-provider')
        // NOTE: dynamically load all custom modules
        file("${rootDir}/custom").eachDir { companyDir ->
            if('build' != companyDir.name && 'docker' != companyDir.name) {
                file("${rootDir}/custom/${companyDir.name}").eachDir { categoryDir ->
                    if('build' != categoryDir.name) {
                        file("${rootDir}/custom/${companyDir.name}/${categoryDir.name}").eachDir { moduleDir ->
                            if('build' != moduleDir.name) {
                                implementation project(":custom:${companyDir.name}:${categoryDir.name}:${moduleDir.name}")
                            }
                        }
                    }
                }
            }
        }
        // NOTE: other custom dependencies
        implementation 'org.mariadb.jdbc:mariadb-java-client'
        implementation 'mysql:mysql-connector-java:8.0.31'
        implementation 'org.postgresql:postgresql'
        annotationProcessor('org.springframework.boot:spring-boot-autoconfigure-processor')
        annotationProcessor('org.springframework.boot:spring-boot-configuration-processor')
    }

    pluginExtensions {
        pluginExtension {
            implementation = 'com.google.cloud.tools.jib.gradle.extension.layerfilter.JibLayerFilterExtension'
            configuration {
                filters {
                    filter {
                        glob = '/app/resources/**'
                    }
                }
            }
        }
    }
}

// tasks.jibDockerBuild.dependsOn(':fineract-provider:bootJar')
