import groovy.util.logging.Slf4j
import org.commonjava.maven.atlas.ident.ref.ProjectVersionRef
import org.commonjava.maven.atlas.ident.ref.SimpleProjectVersionRef
import org.commonjava.maven.ext.common.ManipulationException
import org.commonjava.maven.ext.common.model.Project
import org.commonjava.maven.ext.core.ManipulationSession
import org.commonjava.maven.ext.core.groovy.BaseScript
import org.commonjava.maven.ext.core.groovy.InvocationStage
import org.commonjava.maven.ext.core.groovy.PMEBaseScript
import org.commonjava.maven.ext.core.groovy.PMEInvocationPoint
import org.commonjava.maven.ext.core.state.RESTState
import org.commonjava.maven.ext.io.rest.Translator

/**
 * This script replaces the installer project properties by the one from DA service
 * IMPORTANT: kieVersion and installerCommonsVersion properties need to be defined.
 *      Like -DkieVersion=X.Y.Z -DinstallerCommonsVersion=A.B.C
 */
@PMEInvocationPoint(invocationPoint = InvocationStage.LAST)
@PMEBaseScript BaseScript pme
@Slf4j
public class InstallerAlignmentExecutor {

    BaseScript pme
    Project project

    void execute() {
        String kieVersion = pme.getUserProperties().getProperty("kieVersion")
        setPropertyValue("org.kie:kie-parent:" + kieVersion, "kie-parent", "version.org.kie")
        setPropertyValue("org.uberfire:uberfire-parent:" + kieVersion, "uberfire", "version.org.uberfire")

        String installerCommonsVersion = pme.getUserProperties().getProperty("installerCommonsVersion")
        setPropertyValue("org.jboss.installer:installer-commons:" + installerCommonsVersion, "installer commons", "version.org.jboss.installer")
    }

    private String setPropertyValue(String gavString, String gavName, String property) {
        ProjectVersionRef gavVersionRef = SimpleProjectVersionRef.parse(gavString)
        def gavVersion = getGavVersion(gavVersionRef)
        log.info("{} version retrieved {} ", gavName, gavVersion)
        project.getModel().addProperty(property, gavVersion)
        log.info("Property {} set to {} ", property, gavVersion)
    }

    private String getGavVersion(ProjectVersionRef gav) {
        List<ProjectVersionRef> source = new ArrayList()
        source.add(gav)
        source.add(pme.getGAV())
        Map<ProjectVersionRef, String> restResult = this.getRESTAPI().translateVersions(source)
        String targetBuild = (String) restResult.get(gav)
        if (targetBuild == null) {
            log.error("REST result was {}", restResult)
            throw new ManipulationException("Multiple results returned; unable to get version.", new String[0])
        } else {
            return targetBuild
        }
    }

    private Translator getRESTAPI() throws ManipulationException {
        RESTState rs = (RESTState) ((ManipulationSession) pme.getSession()).getState(RESTState.class)
        return rs.getVersionTranslator()
    }
}

def InstallerAlignmentExecutor installerAlignment = new InstallerAlignmentExecutor(pme: pme, project: pme.getProject())
installerAlignment.execute()
