import groovy.util.logging.Slf4j
import org.apache.maven.model.Parent
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

@PMEInvocationPoint(invocationPoint = InvocationStage.LAST)
@PMEBaseScript BaseScript pme

@Slf4j
public class InstallerAlignment {

    BaseScript pme
    Project project

    def execute() {
        setPropertyValue("org.kie:kie-parent:7.26.0.Final", "kie-parent", "version.org.kie")
        setPropertyValue("org.jboss.installer:installer-commons:2.3.5.rhba", "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 InstallerAlignment installerAlignment = new InstallerAlignment(pme: pme, project: pme.getProject())
installerAlignment.execute()
