#!/usr/bin/env python
"""
 Copyright 2018-present Open Networking Foundation

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
"""

POM_HEADER = '''\
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.onosproject</groupId>
        <artifactId>onos-base</artifactId>
        <version>1</version>
    </parent>'''
POM_FOOTER = '</project>\n'

ID_BLOCK = '''
    <groupId>%s</groupId>
    <artifactId>%s</artifactId>
    <version>%s</version>
    <name>%s</name>
'''

DEPENDENCIES_HEADER = '    <dependencies>\n'
DEPENDENCIES_FOOTER = '    </dependencies>\n'

DEPENDENCY_BLOCK = '''        <dependency>
            <groupId>%s</groupId>
            <artifactId>%s</artifactId>
            <version>%s</version>
        </dependency>
'''

def write(name, msg):
    if name is not None:
        with open(name, "w") as file:
            file.write(msg)
    else:
        print msg


def write_pom(output, coords, deps):
    mvn = coords.split(':')
    lines = POM_HEADER
    lines += ID_BLOCK % (mvn[1], mvn[2], mvn[3], mvn[2])
    lines += DEPENDENCIES_HEADER

    for dep in deps:
        mvn = dep.split(':')
        lines += DEPENDENCY_BLOCK % (mvn[1], mvn[2], mvn[len(mvn)-1])

    lines += DEPENDENCIES_FOOTER
    lines += POM_FOOTER
    write(output, lines)

if __name__ == '__main__':
    import sys

    if len(sys.argv) < 3:
        print 'usage: pom_generator pom.xml maven_coords dep_coords1 dep_coords2 ...'
        sys.exit(1)

    output = sys.argv[1]
    coords = sys.argv[2]
    deps = sys.argv[3:]

    write_pom(output, coords, deps)
