/*
 *  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.
 */

allprojects {
    apply plugin: 'signing'
    signing {
        required {
            rootProject.ext.isReleaseVersion &&
                    (gradle.taskGraph.hasTask(':artifactoryPublish') || rootProject.hasProperty('forceSign'))
        }
    }
}

gradle.taskGraph.whenReady { taskGraph ->
    if (project.ext.isReleaseVersion &&
            (taskGraph.hasTask(':artifactoryPublish') || project.hasProperty('forceSign'))) {
        // Use Java 6's console or Swing to read input (not suitable for CI)
        if (!project.hasProperty('signing.keyId') ||
                !project.hasProperty('signing.secretKeyRingFile') ||
                !project.hasProperty('signing.password')) {
            printf "\n\nWe have to sign some things in this build." +
                    "\n\nPlease enter your signing details.\n\n"
            System.out.flush()

            if (!project.hasProperty('signing.keyId')) {
                project.ext.'signing.keyId' = promptUser('PGP Key Id')
            }
            if (!project.hasProperty('signing.secretKeyRingFile')) {
                project.ext.'signing.secretKeyRingFile' = promptUser('PGP Secret Key Ring File (absolute path)')
            }
            if (!project.hasProperty('signing.password')) {
                project.ext.'signing.password' = promptUser('PGP Private Key Password')
            }

            printf "\nThanks.\n\n"
            System.out.flush()
        }
        allprojects { ext.'signing.keyId' = project.getProperty('signing.keyId') }
        allprojects { ext.'signing.secretKeyRingFile' = project.getProperty('signing.secretKeyRingFile') }
        allprojects { ext.'signing.password' = project.getProperty('signing.password') }
    }
}

def promptUser(String prompt) {
    def response = ''
    if (System.console() == null) {
        new groovy.swing.SwingBuilder().edt {
            dialog(modal: true, // pause build
                    title: 'Reponse required', // dialog title
                    alwaysOnTop: true,
                    resizable: false,
                    locationRelativeTo: null, // centered on screen
                    pack: true,
                    show: true
            ) {
                vbox {
                    label(text: "$prompt:")
                    input = passwordField()
                    button(defaultButton: true, text: 'OK', actionPerformed: {
                        response = new String(input.password)
                        dispose()
                    })
                }
            }
        }
    } else {
        response = new String(System.console().readPassword("\n$prompt: "))
    }

    if (!response) {
        throw new InvalidUserDataException("Null response detected!")
    }
    response
}
