#!/usr/bin/env python3
"""Try to change from GCC10 to GCC11

For it, you need

- Python3
"""

import argparse

releases = {
    'Autotools':                ['20200321',    '20210726'],
    'GCC':                      ['10.3.0',      '11.2.0'],
    'CMake':                    ['3.18.0',      '3.21.1'],
    'imkl':                     ['2021.2.0',    '2021.4.0'],
    'gomkl':                    ['2021',        '2022'],
    'gpsmpi':                   ['2021',        '2022'],
    'binutils':                 ['2.36.1',      '2.37'],
    'Bison':                    ['3.7.6',       '3.7.6'],
    'libdrm':                   ['2.4.106',     '2.4.107'],
    'Java':                     ['15',          '15'],
    'CUDA':                     ['11.3',        '11.5'],
    'cuDNN':                    ['8.2.1.32',    '8.2.2.26'],
    'Scikit':                   ['2021',        '2022'],
    'SciPy':                    ['2021',        '2022'],
    'protobuf':                 ['3.14.0',      '3.17.3'],
    'libxc':                    ['5.1.5',       '5.1.6'],
    'Python':                   ['3.8.5',       '3.9.6'],
    'cURL':                     ['7.71.1',      '7.78.0'],
    'PCRE':                     ['8.44',        '8.45'],
    'PCRE2':                    ['10.34',       '10.37'],
    'Qt5':                      ['5.14.2',      '5.15.2'],
    'Ninja':                    ['1.10.0',      '1.10.2'],
    're2c':                     ['1.3',         '2.2'],
    'GLib':                     ['2.64.4',      '2.69.1'],
    'X11':                      ['20200222',    '20210802'],
    'fontconfig':               ['2.13.92',     '2.13.94'],
    'DBus':                     ['1.12.20',     '1.13.18'],
    'libjpeg-turbo':            ['2.0.5',       '2.0.6'],
    'NSS':                      ['3.51',        '3.69'],
    'JasPer':                   ['2.0.19',      '2.0.33'],
    'snappy':                   ['1.1.8',       '1.1.9'],
    'PROJ':                     ['7.1.0',       '8.1.0'],
    'SQLite':                   ['3.32.3',      '3.36'],
    'LibTIFF':                  ['4.1.0',       '4.3.0'],
    'libgd':                    ['2.3.0',       '2.3.1'],
    'zlib':                     ['1.2.11',      '1.2.11'],
    'Meson':                    ['0.55.0',      '0.58.2'],
    'pkg-config':               ['0.29.2',      '0.29.2'],
    'flex':                     ['2.6.4',       '2.6.4'],
    'libffi':                   ['3.3',         '3.4.2'],
    'GObject-Introspection':    ['1.64.1',      '1.68.0'],
    'cairo':                    ['1.17.2',      '1.16.0'],
    'ATK':                      ['2.36.0',      '2.36.0'],
    'AT-SPI2-core':             ['2.36.0',      '2.40.3'],
    'AT-SPI2-ATK':              ['2.34.2',      '2.38.0'],
    'intltool':                 ['0.51.0',      '0.51.0'],
}


def parse_arguments():
    """Receives command line input"""
    parser = argparse.ArgumentParser(description='Command line options.')
    parser.add_argument('-i', metavar='INPUT', default="", type=str,
                        help='Input File')
    parser.add_argument('-o', metavar='OLDRELEASE', default="", type=str,
                        help='Current version of given software to be replaced')
    parser.add_argument('-n', metavar='LATESTRELEASE', default="", type=str,
                        help='Most recent version of given software')

    return parser.parse_args()


def updateFileName(fileName, current, latest):
    """Tries to bring filename automatically to the latest toolchain"""
    if current and latest:
        fileName = fileName.replace(current, latest, 1)
    if fileName:
        fileName = fileName.replace(releases['GCC'][0], releases['GCC'][1], 1)
        fileName = fileName.replace(
            releases['imkl'][0], releases['imkl'][1], 1)
        fileName = fileName.replace(
            releases['gomkl'][0], releases['gomkl'][1], 1)
        fileName = fileName.replace(
            releases['gpsmpi'][0], releases['gpsmpi'][1], 1)
        fileName = fileName.replace(
            releases['Python'][0], releases['Python'][1], 1)
    return fileName


def updateFile(oldName, newName, current, latest):
    """Replaces toolchain, cleans up site_contacts and goes through the list of releases with the new one"""
    if newName is not oldName:
        newFile = open(newName, 'w')
        with open(oldName) as file:
            for line in file:
                if current and latest:
                    if line.startswith('version'):
                        print("Changing package version...")
                        line = line.replace(current, latest, 1)
                if line.startswith('toolchain'):
                    print("Fixing toolchain...")
                    line = line.replace(
                        releases['GCC'][0], releases['GCC'][1], 1)
                    line = line.replace(
                        releases['imkl'][0], releases['imkl'][1], 1)
                    line = line.replace(
                        releases['gomkl'][0], releases['gomkl'][1], 1)
                    line = line.replace(
                        releases['gpsmpi'][0], releases['gpsmpi'][1], 1)
                if line.startswith('site_contacts'):
                    print("Removing site_contacts")
                    line = ""
                for key in releases:
                    if key in line:
                        print("Changing", key, "from",
                              releases[key][0], "to", releases[key][1])
                        line = line.replace(
                            releases[key][0], releases[key][1], 1)
                newFile.write(line)
        newFile.close()
        return True
    else:
        print("Files are the same")
        return False


if __name__ == "__main__":
    args = parse_arguments()
    newFile = updateFileName(args.i, args.o, args.n)
    if updateFile(args.i, newFile, args.o, args.n):
        print("Updated", args.i, ' to GCC',
              releases['GCC'][1], 'and to version', args.n)
        print("Run: \n\neb -l %s" % newFile)