import groovy.json.JsonOutput
import groovy.json.JsonSlurper

import jenkins.model.Jenkins

unresolvableCalls = [
    podTemplate:'kubernetes',
    container: 'kubernetes',

    docker: 'docker-plugin',

    usernamePassword: 'credentials-binding',
    string: 'credentials-binding',
    file: 'credentials-binding',
]

node() {
    stage('Resolve Plugins') {
        try {
            resolvePlugins()
        } catch(Exception e) {
            def result = System.getenv()['result']
            new File(new File(result).getParentFile(), 'FAILURE').text = "${e.getMessage()}"
            throw e
        }
    }
}

def resolvePlugins() {
    def stepCallMapping = new JsonSlurper().parseText(new File(System.getenv()['calls']).text)

    def stepPluginMapping = [:]

    println "[INFO] Resolving plugins ..."

    for(def step in stepCallMapping) {
        def resolvedPlugins = [:]
        for(def call in step.value) {
            def resolvedPlugin = resolvePlugin(call)
            if (! resolvedPlugin) {
                resolvedPlugin = unresolvableCalls[call]
                if(! resolvedPlugin) resolvedPlugin = 'UNIDENTIFIED'
            }
            if(resolvedPlugins[resolvedPlugin] == null)
                resolvedPlugins[resolvedPlugin] = (Set)[]
            resolvedPlugins[resolvedPlugin] << call
            stepPluginMapping.put(step.key,resolvedPlugins)
        }
    }

    def result = System.getenv()['result']
    new File(result).write(new JsonOutput().toJson(stepPluginMapping))

    println "[INFO] plugins resolved. Result: ${result}."
}

def resolvePlugin(call) {

    def plugins = Jenkins.get().pluginManager.getPlugins()

    def s = new org.jenkinsci.plugins.workflow.cps.Snippetizer()

    def pDescs = s.getQuasiDescriptors(false)


    for(def pd in pDescs) {
        if(pd.getSymbol() == call)
            return  pd.real.plugin?.shortName
    }
    return null
}
