import groovy.util.logging.Slf4j
import org.commonjava.maven.ext.core.groovy.BaseScript
import org.commonjava.maven.ext.core.groovy.GMEBaseScript
import org.commonjava.maven.ext.core.groovy.InvocationPoint
import org.commonjava.maven.ext.core.groovy.InvocationStage
import org.commonjava.maven.atlas.ident.ref.SimpleProjectVersionRef
import org.apache.maven.model.Model

@InvocationPoint(invocationPoint = InvocationStage.PREPARSE)
@GMEBaseScript BaseScript pme

@Slf4j
public class Generator {
    BaseScript pme

    void execute() {
        String sourceArtifact = pme.getUserProperties().get("pomGenerator.sourceArtifact")
        String version = pme.getUserProperties().get("pomGenerator.version")

        if (version != null && Boolean.parseBoolean(pme.getUserProperties().get("pomGenerator.cleanVersion"))) {
            // Find the x.y.z semver within the string and use it
            def matcher = version =~ /\d+(?:[\.-]\d+)*/

            if (matcher.find()) {
                version = matcher.group()
            }
        }

        if (sourceArtifact != null) {
            fetchRemote(sourceArtifact, version)
        } else {
            generateLocal(version)
        }
    }

    void fetchRemote(String sourceArtifact, String version) {
        SimpleProjectVersionRef ref = SimpleProjectVersionRef.parse(sourceArtifact)
        Model pom = pme.getModelIO().resolveRawModel(ref);
        String originalVersion = pom.getVersion()
        pom.getProperties().setProperty("pomGenerator.originalVersion", originalVersion)

        if (version != null) {
            pom.setVersion(version);
        }

        pme.getPomIO().writeModel(pom, new File(pme.getBaseDir(), "pom.xml"))
    }

    void generateLocal(String version) {
        File pom = new File(pme.getBaseDir(), "pom.xml")

        pom.text = """\
        <project>
            <modelVersion>4.0.0</modelVersion>
            <name>${pme.getUserProperties().get("pomGenerator.name")}</name>
            <groupId>${pme.getUserProperties().get("pomGenerator.groupId")}</groupId>
            <artifactId>${pme.getUserProperties().get("pomGenerator.artifactId")}</artifactId>
            <version>${version}</version>
        </project>
        """.stripIndent()

        log.info("Generated pom.xml")
    }
}

Generator gen = new Generator(pme:pme)
gen.execute()
