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

import org.kohsuke.github.*

/**
 * A script to report on the build status of synchronization for branches camel-main and quarkus-main.
 *
 * A GitHub issue ID is passed to this script from the GitHub workflow. The issue is inteded to be repeatedly closed / reopened
 * whenever a build workflow run is successful / unsuccessful.
 *
 * If failures were encountered in the build, a comment is appended to a specified GitHub issue, with the body containing
 * information about the commit SHA and a link to the build.
 *
 * If the build was successful, the open GitHub issue relating to the branch build will be closed.
 *
 * The script also outputs a GitHub action step variable named 'overall_build_status', this is used by the build to determine whether it
 * should automatically merge the latest changes from the main branch, to the target branch.
 */

final String TOKEN = properties['token']
final String STATUS = properties['status'].toLowerCase(Locale.US)
final String BUILD_ID = properties['buildId']
final String REPO = properties['repo']
final String BRANCH = properties['branch']
final String BRANCH_NAME = "${BRANCH.split('-')[0].capitalize()} ${BRANCH.split('-')[1].capitalize()}"
final String BRANCH_COMMIT = properties['branch-commit'] ?: 'Unknown'
final String ACTIONS_URL = "https://github.com/${REPO}/actions/runs/${BUILD_ID.split("-")[0]}"
final String BRANCH_URL = "https://github.com/${REPO}/tree/${BRANCH}"
final String ISSUE_LABEL = "build/${BRANCH}"
final Integer ISSUE_ID = properties['issueId'] as Integer

class Utils {
    static boolean workflowHasPreviousFailures(GHIssue issue, String buildId) {
        String issueCommentMatch = "Build ID: ${buildId}"
        int failureCount = issue.getComments().count { comment ->
            comment.getBody().contains(issueCommentMatch)
        }
        return issue.getBody().contains(issueCommentMatch) || failureCount > 0
    }
}

if (STATUS == "cancelled") {
    println("Job status is cancelled - exiting")
    return
}
println("Workflow status is ${STATUS}")

final GitHub github = new GitHubBuilder().withOAuthToken(TOKEN, "github-actions").build()
final GHRepository repository = github.getRepository(REPO)
final String camelQuarkusCommit = "git rev-parse HEAD".execute().text

GHIssue issue = repository.getIssue(ISSUE_ID)

if (issue == null) {
    println("Unable to find the issue with id ${ISSUE_ID} in project ${REPO}")
    System.exit(1)
} else {
    println("Report issue found: ${issue.getTitle()} - ${issue.getHtmlUrl()}")
}

if (STATUS == "failure") {
    if (Utils.workflowHasPreviousFailures(issue, BUILD_ID)) {
        println("Workflow for Build ID ${BUILD_ID} has already reported failures - exiting")
    } else {
        if (issue.getState() == GHIssueState.CLOSED) {
            issue.reopen()
        }

        issue.comment("""The [${BRANCH}](${BRANCH_URL}) branch build has failed:

* Build ID: ${BUILD_ID}
* Camel Quarkus Commit: ${camelQuarkusCommit}
* ${BRANCH_NAME} Commit: ${BRANCH_COMMIT}
* Link to build: ${ACTIONS_URL}""")

        println("Commented on issue ${issue.getHtmlUrl()}")
    }
}

if (STATUS == "verify") {
    if (Utils.workflowHasPreviousFailures(issue, BUILD_ID)) {
        println("Overall build status is: failure")
        println "::set-output name=overall_build_status::failure"
        return
    } else {
        if (issue.getState() == GHIssueState.OPEN) {
            final GHIssueComment comment = issue.comment("""Build fixed with:

* Camel Quarkus Commit: ${camelQuarkusCommit}
* ${BRANCH_NAME} Commit: ${BRANCH_COMMIT}
* Link to build: ${ACTIONS_URL}""")

            issue.close()
            println("Comment added on issue ${issue.getHtmlUrl()} - ${comment.getHtmlUrl()}, the issue has also been closed")
        }
    }
    println "::set-output name=overall_build_status::success"
}
