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

/* groovylint-disable JavaIoPackageAccess */


ArrayList calculateBadges(Map project) {
    def badges = []
    if (getStatus("https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/badge/icon") != 404) {
        println 'Adding build status badge...'
        badges.add("&#32;[![Build Status](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/badge/icon)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/)")
    }
    if (responseValid("https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/")) {
        println 'Adding test status badge...'
        badges.add("&#32;[![Test Status](https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/test/?width=800&height=600)")
    }
    if (responseValid("https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=coverage")) {
        println 'Adding coverage status badge...'
        badges.add("&#32;[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=coverage)](https://sonarcloud.io/dashboard?id=apache_sling-${project.folder})")
    }
    if (responseValid("https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=alert_status")) {
        println 'Adding quality status badge...'
        badges.add("&#32;[![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=alert_status)](https://sonarcloud.io/dashboard?id=apache_sling-${project.folder})")
    }
    if (getStatus("https://www.javadoc.io/badge/org.apache.sling/${project.artifactId}.svg") != 404) {
        println 'Adding JavaDoc badge...'
        badges.add("&#32;[![JavaDoc](https://www.javadoc.io/badge/org.apache.sling/${project.artifactId}.svg)](https://www.javadoc.io/doc/org.apache.sling/${project.folder})")
    }
    if (responseValid("https://maven-badges.herokuapp.com/maven-central/org.apache.sling/$project.artifactId/badge.svg")) {
        println 'Adding Maven release badge...'
        badges.add("&#32;[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.sling/${project.artifactId}/badge.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.sling%22%20a%3A%22${project.artifactId}%22)")
    }
    if (project.contrib) {
        println 'Adding contrib status badge...'
        badges.add('&#32;[![Contrib](https://sling.apache.org/badges/status-contrib.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/status/contrib.md)')
    }
    if (project.deprecated) {
        println 'Adding deprecated status badge...'
        badges.add('&#32;[![Deprecated](https://sling.apache.org/badges/status-deprecated.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/status/deprecated.md)')
    }
    if (project.group) {
        println 'Adding group badge...'
        badges.add("&#32;[![${project.group}](https://sling.apache.org/badges/group-${project.group}.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/group/${project.group}.md)")
    }
    return badges
}

String getProjectGroup(String repoName, File aggregatorDir) {
    println 'Loading manifest...'

    manifest = new XmlParser().parseText(new File(aggregatorDir, 'default.xml').text)

    def groupNode = projectGroup = manifest.project.find {
        it.@path == repoName
    }
    if (groupNode != null) {
        def groupName = groupNode['@groups']
        if (groupName != null) {
            println "Using Group: ${groupName}"
            return groupName
        }
    }
    return ''
}

int getStatus(String url) {
    def get = new URL(url).openConnection()
    get.setRequestProperty('User-Agent', 'curl/7.35.0')
    def rc = get.getResponseCode()
    println 'Retrieved status ' + rc + ' from ' + url
    return rc
}

Map parseMavenPom(File projectFolder, File aggregatorDir) {
    File pomFile = new File(projectFolder, 'pom.xml')
    String repoName = projectFolder.name

    println "Fetching from ${projectFolder}..."

    println 'Reading status lists...'
    String[] deprecated = new File(aggregatorDir, 'deprecated-projects.txt').text.split('\\n')
    assert deprecated
    String[] contrib = new File(aggregatorDir, 'contrib-projects.txt').text.split('\\n')
    assert contrib

    if (pomFile.exists()) {
        println 'Parsing pom.xml...'
        Node pom = new XmlParser().parseText(pomFile.text)

        Map project = [:]
        project['artifactId'] = pom.artifactId.text()
        project['name'] = pom.name.text()
        project['description'] = pom.description.text().replace('\n', ' ')
        project['group'] = getProjectGroup(repoName, aggregatorDir)
        project['folder'] = repoName
        if (contrib.contains(repoName)) {
            println 'Setting project status to contrib...'
            project['contrib'] = true
        }
        if (deprecated.contains(repoName)) {
            println 'Setting project status to deprecated...'
            project['deprecated'] = true
        }
        return project
    }
    return null
}

boolean responseValid(String url) {
    def get = new URL(url).openConnection()
    get.setRequestProperty('User-Agent', 'curl/7.35.0')
    int rc = get.responseCode
    println 'Retrieved status ' + rc + ' from ' + url
    if (rc == 200) {
        String text = get.inputStream.text
        if (text.contains('inaccessible') || text.contains('not found') || text.contains('not been found')
            || text.contains('invalid') || text.contains('unknown')) {
            println "Retrieved invalid response from ${url}"
            return false
            }
        return true
    }
    println "Retrieved invalid response code ${rc} from ${url}"
    return false
}
