# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

"""
This script changes versions in every pom.xml and relevant files.

(How to run)
python change_version <reef_home> <reef_version_for_pom.xml> -s <true or false>  (optional) -p 

-s option changes value of 'IsSnapshot' in lang/cs/build.props.
If you use the option "-s false", bulid.props changes as,
 <IsSnapshot>false</IsSnapshot>
 <SnapshotNumber>00</SnapshotNumber>

If you use "-s true", then the value of 'IsSnapshot' is changed to true.

If you use "-p", then only the "pom.xml" files are changed.

You can also see how to run the script with "python change_version.py -h"

(Example)
python change_version ~/reef 0.14.0 -s true
python change_version ~/reef 0.14.0 -s false
python change_version ~/reef 0.14.0 -p -s true
"""


import os
import re
import sys
import argparse

"""
Get list of path for every file in a directory
"""
def get_filepaths(directory):
    file_paths = []

    for root, directories, files in os.walk(directory):
        for filename in files:
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)
    return file_paths

"""
Change REEF version to new_version in every pom.xml
"""
def change_pom(file, new_version):
    changed_str = ""
    ready_to_change = False

    f = open(file, 'r')

    while True:
        line = f.readline()
        if not line:
            break
        if "<groupId>org.apache.reef</groupId>" in line:
            ready_to_change = True
        if "<version>" in line and ready_to_change:
            break
        changed_str += line

    r = re.compile('<version>(.*?)</version>')
    m = r.search(line)
    old_version = m.group(1)
    changed_str += line.replace(old_version, new_version)

    while True:
        line = f.readline()
        if not line: 
            break
        changed_str += line
    f.close()

    f = open(file, 'w')
    f.write(changed_str)
    f.close()

"""
Change JavaBridgeJarFileName in lang/cs/Org.Apache.REEF.Driver/Constants.cs
or in lang/cs/Org.Apache.REEF.Driver/DriverConfigGenerator.cs
"""
def change_constants_cs(file, new_version):
    changed_str = ""

    f = open(file, 'r')
    while True:
        line = f.readline()
        if not line:
            break

        if "JavaBridgeJarFileName =" in line:
            r = re.compile('"(.*?)"')
            m = r.search(line)
            old_version = m.group(1)
            new_version = "reef-bridge-java-" + new_version + "-shaded.jar"
            changed_str += line.replace(old_version, new_version)
        else:
            changed_str += line
    f.close()

    f = open(file, 'w')
    f.write(changed_str)
    f.close()

"""
Change version in every AssemblyInfo.cs and AssemblyInfo.cpp
"""
def change_assembly_info_cs(file, new_version):
    changed_str = ""
    new_version = new_version.split("-")[0] + ".0"
    
    f = open(file, 'r')
    r = re.compile('"(.*?)"')

    while True:
        line = f.readline()
        if not line:
            break
        if ("[assembly: AssemblyVersion(" in line and "*" not in line) or ("[assembly: AssemblyFileVersion(" in line) \
            or ("[assembly:AssemblyVersionAttribute(" in line and "*" not in line) \
            or ("[assembly:AssemblyFileVersion(" in line):
            m = r.search(line)
            old_version = m.group(1)
            changed_str += line.replace(old_version, new_version)
        else:
            changed_str += line
    f.close()

    f = open(file, 'w')
    f.write(changed_str)
    f.close()

"""
Read 'IsSnapshot' from lang/cs/build.props
"""
def read_is_snapshot(file):
    f = open(file, 'r')
    r = re.compile('<IsSnapshot>(.*?)</IsSnapshot>')
    while True:
        line = f.readline()
        if not line:
            break
        if "<IsSnapshot>" in line and "</IsSnapshot>" in line:
            m = r.search(line)
            if(m.group(1)=="true"):
                return True
            else:
                return False
    f.close()

"""
Change lang/cs/build.props for the release branch
"""
def change_build_props(file, is_snapshot):
    changed_str = ""

    f = open(file, 'r')
    r1 = re.compile('<IsSnapshot>(.*?)</IsSnapshot>')
    r2 = re.compile('<SnapshotNumber>(.*?)</SnapshotNumber>')

    while True:
        line = f.readline()
        if not line:
            break
        if "<IsSnapshot>" in line and "</IsSnapshot>" in line:
            old_is_snapshot = r1.search(line).group(1)
            changed_str += line.replace(old_is_snapshot, is_snapshot)
        elif "<SnapshotNumber>" in line and "</SnapshotNumber>" in line and is_snapshot=="false":
            old_snapshot_number = r2.search(line).group(1)
            changed_str += line.replace(old_snapshot_number, "00")
        else:
            changed_str += line
    f.close()

    f = open(file, 'w')
    f.write(changed_str)
    f.close()

    print file

"""
Change the name of shaded.jar in run.cmd and lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml
"""
def change_shaded_jar_name(file, new_version):
    changed_str = ""

    f = open(file, 'r')
    r1 = re.compile('reef-bridge-java-(.*?)-shaded.jar')
    r2 = re.compile('reef-bridge-client-(.*?)-shaded.jar')
    while True:
        line = f.readline()
        if not line:
            break
        m1 = r1.search(line)
        m2 = r2.search(line)
        if m1 is not None:
            changed_str += line.replace(m1.group(1), new_version)
        elif m2 is not None:
            changed_str += line.replace(m2.group(1), new_version)
        else:
            changed_str += line
    f.close()

    f = open(file, 'w')
    f.write(changed_str)
    f.close()

"""
Change the version in Doxyfile
"""
def change_project_number_Doxyfile(file, new_version):
    changed_str = ""

    f = open(file, 'r')
    while True:
        line = f.readline()
        if not line:
            break

        if "PROJECT_NUMBER         = " in line:
            r = re.compile('= (.*?)$')
            m = r.search(line)
            old_version = m.group(1)
            changed_str += line.replace(old_version, new_version)
        else:
            changed_str += line
    f.close()

    f = open(file, 'w')
    f.write(changed_str)
    f.close()


"""
Change version of every pom.xml, every AssemblyInfo.cs,
Constants.cs, AssemblyInfo.cpp, run.cmd and Resources.xml
"""
def change_version(reef_home, new_version, pom_only):
    if pom_only:
        for fi in get_filepaths(reef_home):
            if "pom.xml" in fi:
                print fi
                change_pom(fi, new_version)

    else:
        for fi in get_filepaths(reef_home):
            if "pom.xml" in fi:
                print fi
                change_pom(fi, new_version)
            if "AssemblyInfo.cs" in fi:
                print fi
                change_assembly_info_cs(fi, new_version)

        change_assembly_info_cs(reef_home + "/lang/cs/Org.Apache.REEF.Bridge/AssemblyInfo.cpp", new_version)
        print reef_home + "/lang/cs/Org.Apache.REEF.Bridge/AssemblyInfo.cpp"

        change_assembly_info_cs(reef_home + "/lang/cs/Org.Apache.REEF.ClrDriver/AssemblyInfo.cpp", new_version)
        print reef_home + "/lang/cs/Org.Apache.REEF.ClrDriver/AssemblyInfo.cpp"

        change_constants_cs(reef_home + "/lang/cs/Org.Apache.REEF.Driver/Constants.cs", new_version)
        print reef_home + "/lang/cs/Org.Apache.REEF.Driver/Constants.cs"

        change_constants_cs(reef_home + "/lang/cs/Org.Apache.REEF.Driver/DriverConfigGenerator.cs", new_version)
        print reef_home + "/lang/cs/Org.Apache.REEF.Driver/DriverConfigGenerator.cs"

        change_shaded_jar_name(reef_home + "/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml", new_version)
        print reef_home + "/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml"

        change_shaded_jar_name(reef_home + "/lang/cs/Org.Apache.REEF.Client/run.cmd", new_version)
        print reef_home + "/lang/cs/Org.Apache.REEF.Client/run.cmd"

        change_project_number_Doxyfile(reef_home + "/Doxyfile", new_version)
        print reef_home + "/Doxyfile"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Script for changing version of every pom.xml, " \
        + "every AssemblyInfo.cs, Constants.cs, and AssemblyInfo.cpp")
    parser.add_argument("reef_home", type=str, help="REEF home")
    parser.add_argument("reef_version", type=str, help="REEF version")
    parser.add_argument("-s", "--isSnapshot", type=str, metavar="<true or false>", help="Change 'IsSnapshot' to true or false", required=True)
    parser.add_argument("-p", "--pomonly", help="Change only poms", action="store_true")
    args = parser.parse_args()
    
    reef_home = os.path.abspath(args.reef_home)
    reef_version = args.reef_version
    is_snapshot = args.isSnapshot
    pom_only = args.pomonly

    if is_snapshot is not None and not pom_only:
        change_build_props(reef_home + "/lang/cs/build.props", is_snapshot)

    if is_snapshot=="true":
        reef_version += "-SNAPSHOT"

    change_version(reef_home, reef_version, pom_only)

