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

For it, you need

- Python3
"""

import argparse


releases = {
    'ATK':                      ['2.36.0',          '2.36.0'],
    'AT-SPI2-ATK':              ['2.34.2',          '2.38.0'],
    'AT-SPI2-core':             ['2.36.0',          '2.40.3'],
    'Autotools':                ['20200321',        '20210726'],
    'binutils':                 ['2.36.1',          '2.37'],
    'Bison':                    ['3.7.6',           '3.7.6'],
    'Boost':                    ['1.74.0',          '1.78.0'],
    'Boost.Python':             ['1.74.0',          '1.78.0'],
    'cairo':                    ['1.17.2',          '1.16.0'],
    'CMake':                    ['3.18.0',          '3.21.1'],
    'Coreutils':                ['8.32',            '9.0'],
    'CUDA':                     ['11.3',            '11.5'],
    'cuDNN':                    ['8.2.1.32',        '8.2.2.26'],
    'cURL':                     ['7.71.1',          '7.78.0'],
    'dask':                     ['2.22.0',          '2021.9.1'],
    'DBus':                     ['1.12.20',         '1.13.18'],
    'Eigen':                    ['3.3.7',           '3.3.9'],
    'FFmpeg':                   ['4.3.1',           '4.4.1'],
    'FFTW':                     ['3.3.8',           '3.3.10'],
    'Flask':                    ['1.1.4',           '2.0.2'],
    'flex':                     ['2.6.4',           '2.6.4'],
    'FLTK':                     ['1.3.5',           '1.3.7'],
    'fontconfig':               ['2.13.92',         '2.13.94'],
    'freetype':                 ['2.10.1',          '2.11.0'],
    'FriBidi':                  ['1.0.9',           '1.0.10'],
    'gc':                       ['8.0.2',           '8.2.0'],
    'GCC':                      ['10.3.0',          '11.2.0'],
    'gcccoremkl':               ['10.3.0-2021.2.0', '11.2.0-2021.4.0'],
    'Gdk-Pixbuf':               ['2.40.0',          '2.42.6'],
    'GEOS':                     ['3.8.1',           '3.9.1'],
    'Ghostscript':              ['9.52',            '9.54.0'],
    'GLib':                     ['2.64.4',          '2.69.1'],
    'GMP':                      ['6.2.0',           '6.2.1'],
    'Go':                       ['1.15.3',          '1.17.3'],
    'GObject-Introspection':    ['1.64.1',          '1.68.0'],
    'gomkl':                    ['2021',            '2021b'],
    'gpsmkl':                   ['2021',            '2021b'],
    'gpsmpi':                   ['2021',            '2021b'],
    'GSL':                      ['2.6',             '2.7'],
    'GTK+':                     ['3.24.17',         '3.24.23'],
    'GTS':                      ['0.7.6',           '0.7.6'],
    'HarfBuzz':                 ['2.6.7',           '2.8.2'],
    'HTSLib':                   ['1.1.4',           '1.1.4'],
    'ICU':                      ['67.1',            '70.1'],
    'ImageMagick':              ['7.0.10-25',        '7.1.0.13'],
    'imkl':                     ['2021.2.0',        '2021.4.0'],
    'intltool':                 ['0.51.0',          '0.51.0'],
    'ispc':                     ['1.12.0',          '1.16.1'],
    'JasPer':                   ['2.0.19',          '2.0.33'],
    'Java':                     ['15',              '15'],
    'libcroco':                 ['0.6.13',          '0.6.13'],
    'libdrm':                   ['2.4.106',         '2.4.107'],
    'libepoxy':                 ['1.5.4',           '1.5.9'],
    'libffi':                   ['3.3',             '3.4.2'],
    'libgd':                    ['2.3.0',           '2.3.1'],
    'libjpeg-turbo':            ['2.0.5',           '2.1.1'],
    'libreadline':              ['8.0',             '8.1'],
    'librsvg':                  ['2.48.8',          '2.51.2'],
    'LibTIFF':                  ['4.1.0',           '4.3.0'],
    'libxc':                    ['5.1.5',           '5.1.6'],
    'libxml2':                  ['2.9.10',          '2.9.10'],
    'LLVM':                     ['10.0.1',          '13.0.0'],
    'M4':                       ['1.4.18',          '1.4.19'],
    'Mako':                     ['1.1.3',           '1.1.4'],
    'matplotlib':               ['3.4.2',           '3.4.3'],
    'Meson':                    ['0.55.0',          '0.58.2'],
    'MPFR':                     ['4.1.0',           '4.1.0'],
    'NASM':                     ['2.15.03',         '2.15.05'],
    'Ninja':                    ['1.10.0',          '1.10.2'],
    'NSS':                      ['3.51',            '3.69'],
    'numactl':                  ['2.0.13',          '2.0.14'],
    'OpenEXR':                  ['2.5.2',           '3.1.1'],
    'OpenGL':                   ['2020',            '2021b'],
    'Pango':                    ['1.44.7',          '1.48.8'],
    'parallel':                 ['20201122',        '20210722'],
    'PCRE2':                    ['10.34',           '10.37'],
    'PCRE':                     ['8.44',            '8.45'],
    'Perl':                     ['5.32.0',          '5.34.0'],
    'pkg-config':               ['0.29.2',          '0.29.2'],
    'pkgconfig':                ['1.5.4',           '1.5.5'],
    'PROJ':                     ['7.1.0',           '8.1.0'],
    'protobuf':                 ['3.14.0',          '3.17.3'],
    'psmpi':                    ['5.4.9-1',         '5.5.0-1'],
    'pybind11':                 ['2.5.0',           '2.7.1'],
    'pyproj':                   ['2.6.1.post1',     '3.3.0'],
    'Python':                   ['3.8.5',           '3.9.6'],
    'Qt5':                      ['5.14.2',          '5.15.2'],
    'RDFlib':                   ['5.0.0',           '6.0.2'],
    're2c':                     ['1.3',             '2.2'],
    'Rust':                     ['1.47.0',          '1.54.0'],
    'Scikit':                   ['2021',            '2022'],
    'SciPy':                    ['2021',            '2021b'],
    'Shapely':                  ['1.7.1',           '1.8.0'],
    'SuiteSparse':              ['5.7.1',           '5.10.1'],
    'snappy':                   ['1.1.8',           '1.1.9'],
    'SQLite':                   ['3.32.3',          '3.36'],
    'Tcl':                      ['8.6.10',          '8.6.11'],
    'texinfo':                  ['6.7',             '6.8'],
    'texlive':                  ['20200406',        '20200406'],
    'tqdm':                     ['4.62.3',          '4.62.3'],
    'X11':                      ['20200222',        '20210802'],
    'x264':                     ['20200912',        '20210613'],
    'XServer':                  ['1.20.9',          '1.20.13'],
    'zlib':                     ['1.2.11',          '1.2.11'],
    'zstd':                     ['1.4.9',           '1.5.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)
        if 'gcccoremkl' in fileName:
            fileName = fileName.replace(
                releases['imkl'][0], releases['imkl'][1], 1)
        elif 'gomkl' in fileName:
            fileName = fileName.replace(
                releases['gomkl'][0], releases['gomkl'][1], 1)
        elif 'gpsmpi' in fileName:
            fileName = fileName.replace(
                releases['gpsmpi'][0], releases['gpsmpi'][1], 1)
        elif 'gpsmkl' in fileName:
            fileName = fileName.replace(
                releases['gpsmkl'][0], releases['gpsmkl'][1], 1)
        fileName = fileName.replace(
            '-Python-3.8.5', '', 1)
    return fileName


def updateFile(oldName, newName, current, latest):
    versionSuffixIsPython = False
    """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)
                    line = line.replace(
                        releases['gcccoremkl'][0], releases['gcccoremkl'][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)
                if line.startswith("versionsuffix = '-Python"):
                    print("Removing python version suffix")
                    versionSuffixIsPython = True
                    line = ''
                if versionSuffixIsPython:
                    line = line.replace(', versionsuffix', '', 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)