#!/usr/bin/python3

# Convert maven pom file to xmvn metadata
# (c) 2026 Andrey Cherepanov <cas@altlinux.org>

# This program is free software; you can redistribute it and/or modify it
# under the terms of GNU General Public License (GPL) version 3 or later.

import os, sys, argparse, copy
import xml.etree.ElementTree as ET
from xml.dom import minidom

VERSION="1.0.0"

def pom_to_metadata(pom_file, output_file, subdirectory):
    # Read POM file
    try:
        pom = ET.parse(pom_file)
        root = pom.getroot()
    except Exception as e:
        print(f"Error: {e}")
        sys.exit(1)

    # Create metadata tree
    metadata = ET.Element('metadata')
    metadata.set('xmlns', 'http://fedorahosted.org/xmvn/METADATA/3.0.0')
    artifacts = ET.SubElement(metadata, 'artifacts')
    pom = ET.SubElement(artifacts, 'artifact')

    # Read artifact data from POM
    ns = {'mvn': 'http://maven.apache.org/POM/4.0.0'}
    group_id = root.find('mvn:groupId', ns)
    artifact_id = root.find('mvn:artifactId', ns)
    version = root.find('mvn:version', ns)

    # Fill artifact data
    if group_id is not None:
        ET.SubElement(pom, 'groupId').text = group_id.text
    if artifact_id is not None:
        ET.SubElement(pom, 'artifactId').text = artifact_id.text
    if version is not None:
        ET.SubElement(pom, 'version').text = version.text

    # Copy pom artifact for jar
    jar = copy.deepcopy(pom)

    # Generate path
    if not subdirectory:
        file_name = artifact_id.text
    else:
        file_name = f"{subdirectory}/{artifact_id.text}"
    pom_file = f"/usr/share/maven-poms/{file_name}.pom"
    jar_file = f"/usr/share/java/{file_name}.jar"

    # Fill path for pom
    ET.SubElement(pom, 'extension').text = 'pom'
    ET.SubElement(pom, 'path').text = pom_file

    # Dependencies
    dependencies = root.find('mvn:dependencies', ns)
    if dependencies is not None:
        deps_elem = ET.SubElement(pom, 'dependencies')
        for dep in dependencies.findall('mvn:dependency', ns):
            dep_elem = ET.SubElement(deps_elem, 'dependency')
            ET.SubElement(dep_elem, 'groupId').text = dep.find('mvn:groupId', ns).text
            ET.SubElement(dep_elem, 'artifactId').text = dep.find('mvn:artifactId', ns).text
            version_elem = dep.find('mvn:version', ns)
            if version_elem is not None:
                ET.SubElement(dep_elem, 'version').text = version_elem.text
            scope_elem = dep.find('mvn:scope', ns)
            if scope_elem is not None:
                ET.SubElement(dep_elem, 'scope').text = scope_elem.text

    # Fill path for jar
    ET.SubElement(jar, 'path').text = jar_file
    artifacts.append(jar)

    # Output to file
    xml_str = ET.tostring(metadata, encoding='unicode')
    dom = minidom.parseString(xml_str)
    pretty_xml = dom.toprettyxml(indent='  ')

    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(pretty_xml)
    except Exception as e:
        print(f"Error: {e}")

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        prog='pom2metadata',
        description='Convert maven pom file to xmvn metadata',
        epilog='Example: %(prog)s pom.xml metadata.xml',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        add_help=False
    )
    parser.add_argument('input', help='POM file')
    parser.add_argument('output', help='XMvn metadata file')
    parser.add_argument('subdir', nargs='?', help='POM and JAR subdirectory')
    parser.add_argument(
        '-h', '--help',
        action='help',
        default=argparse.SUPPRESS,
        help='Show help and exit'
    )
    parser.add_argument(
        '-v', '--version',
        action='version',
        version='%(prog)s ' + VERSION,
        help='Show program version and exit'
    )
    # Parse command line arguments
    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(0)
    try:
        args = parser.parse_args()
    except SystemExit:
        sys.exit(1)

    # Convert
    pom_to_metadata(args.input, args.output, args.subdir)
