// Based on https://stackoverflow.com/a/42160584/453052

project.ext.buildPomXmlDependencies = { pom, configurations ->
    pom.withXml {
        final rootNode = asNode().appendNode('dependencies')
        addConfigurationDependencies(rootNode, configurations.api, 'compile')
        addConfigurationDependencies(rootNode, configurations.implementation, 'runtime')

        // Legacy syntax
        if (configurations.hasProperty('compile')) {
            addConfigurationDependencies(rootNode, configurations.compile, 'compile')
        }
    }
}

private static def addConfigurationDependencies(rootNode, Configuration configuration, String scope) {
    configuration.dependencies.each { dep -> addChildDependency(rootNode, dep, scope) }
}

private static def addChildDependency(rootNode, Dependency dep, String scope) {
    if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified")
        return

    final childNode = rootNode.appendNode('dependency')
    childNode.appendNode('groupId', dep.group)
    childNode.appendNode('artifactId', dep.name)
    childNode.appendNode('version', dep.version)
    childNode.appendNode('scope', scope)

    if (!dep.transitive) {
        // If this dependency is transitive, we should force exclude all its dependencies them from the POM
        final exclusionNode = childNode.appendNode('exclusions').appendNode('exclusion')
        exclusionNode.appendNode('groupId', '*')
        exclusionNode.appendNode('artifactId', '*')
    } else if (!dep.properties.excludeRules.empty) {
        // Otherwise add specified exclude rules
        final exclusionNode = childNode.appendNode('exclusions').appendNode('exclusion')
        dep.properties.excludeRules.each { ExcludeRule rule ->
            exclusionNode.appendNode('groupId', rule.group ?: '*')
            exclusionNode.appendNode('artifactId', rule.module ?: '*')
        }
    }
}
