#!/bin/sh
''''[ ! -z $VIRTUAL_ENV ] && exec python -u -- "$0" ${1+"$@"}; command -v python3 > /dev/null && exec python3 -u -- "$0" ${1+"$@"}; exec python2 -u -- "$0" ${1+"$@"} # '''

import sys
import os
import argparse

HERE = os.path.dirname(__file__)
ROOT = os.path.abspath(os.path.join(HERE, ".."))
sys.path.insert(0, ROOT)
import paella

#----------------------------------------------------------------------------------------------

class SystemSetup(paella.Setup):
    def __init__(self, nop=False, modern=False):
        paella.Setup.__init__(self, nop)
        self.modern = modern

    def ubuntu(self):
        self.install("build-essential")
        if self.modern:
            if self.platform.is_arm64():
                self.add_repo("ppa:ubuntu-toolchain-r/test")
                self.install("gcc-11 g++-11", output=False, _try=True)
                self.run("update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 60 --slave /usr/bin/g++ g++ /usr/bin/g++-11", sudo=True)
            else:
                if self.os_version[0] < 20:
                    self.run(r'''bash -c "echo 'APT::Acquire::Retries \"7\";' > /etc/apt/apt.conf.d/80-retries"''', sudo=True)
                    self.add_repo("ppa:ubuntu-toolchain-r/test")
                if self.install("gcc-10 g++-10", output=False, _try=True) == 0:
                    self.run("update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 60 --slave /usr/bin/g++ g++ /usr/bin/g++-10", sudo=True)
                else:
                    self.install("gcc-9 g++-9")
                    self.run("update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9", sudo=True)

    def debian(self):
        if not self.modern or self.os_version[0] > 10:
            self.install("build-essential")
        else:
            eprint("cannot install modern gcc for {}".format(self.osnick))
            sys.exit(1)
#            if self.os_version[0] < 10:
#                eprint("cannot install modern gcc for {}".format(self.osnick))
#                sys.exit(1)
#            self.install("gcc") # workaround for testing repo installations
#            paella.fwrite('/etc/apt/apt.conf.d/80-retries', 'APT::Acquire::Retries "3";')
#            self.run("echo 'deb http://deb.debian.org/debian testing main' > /etc/apt/sources.list.d/testing.list", sudo=True)
#            self.run("apt-get update -qq, sudo=True")
#            self.run("apt-get install -y -t testing build-essential", sudo=True)
#            self.run("update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10", sudo=True)
#            self.run("update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10", sudo=True)

    def redhat_compat(self):
        self.group_install("'Development Tools'")
        if not self.has_command("sudo"):
            self.install("sudo") # needed due to SCL sudo script
        if self.modern:
            if self.dist in ['centos', 'ol'] and self.os_version[0] == 8:
                self.install("gcc-toolset-11-gcc gcc-toolset-11-gcc-c++")
                self.install("gcc-toolset-11-libatomic-devel")
                self.run("rm -f {}/gcc-toolset-*.sh".format(self.profile_d), sudo=True)
                self.cp_to_profile_d("/opt/rh/gcc-toolset-11/enable", "gcc-toolset-11.sh")
            elif self.arch == 'arm64v8':
                self.install("centos-release-scl")
                self.install("devtoolset-10")
                self.install("devtoolset-10-libatomic-devel")
                self.run("rm -f {}/scl-devtoolset-*.sh".format(self.profile_d), sudo=True)
                self.cp_to_profile_d("/opt/rh/devtoolset-10/enable", "scl-devtoolset-10.sh")
            else:
                self.install("centos-release-scl")
                self.install("devtoolset-11")
                self.install("devtoolset-11-libatomic-devel")
                self.run("rm -f {}/scl-devtoolset-*.sh".format(self.profile_d), sudo=True)
                self.cp_to_profile_d("/opt/rh/devtoolset-11/enable", "scl-devtoolset-11.sh")

    def fedora(self):
        self.group_install("'Development Tools'")

    def alpine(self):
        self.install("build-base musl-dev gcc g++")

    def macos(self):
        if self.modern:
            self.install("gcc@11")
            gccdir = sh("brew --prefix gcc@11")
            self.run(f"ln -sf {gccdir}/bin/gcc-11 $HOME/.local/bin/gcc-11")
            self.run(f"ln -sf {gccdir}/bin/g++-11 $HOME/.local/bin/g++-11")
            self.run(f"ln -sf {gccdir}/bin/cpp-11 $HOME/.local/bin/cpp-11")
            self.run(f"cd $HOME/.local/bin; ln -sf gcc-11 gcc")
            self.run(f"cd $HOME/.local/bin; ln -sf g++-11 g++")
            self.run(f"cd $HOME/.local/bin; ln -sf cpp-11 cpp")
            self.run(f"cd $HOME/.local/bin; ln -sf gcc-11 cc")
            self.run(f"cd $HOME/.local/bin; ln -sf gcc-11 c++")
        else:
            if sh('xcode-select -p') == '':
                fatal("Xcode tools are not installed. Please run xcode-select --install.")
                # install brew (which will install Xcode command line tools):
                # self.run("/bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)'", sudo=True)

#----------------------------------------------------------------------------------------------

parser = argparse.ArgumentParser(description='Set up GCC build environemnt.')
parser.add_argument('-n', '--nop', action="store_true", help='no operation')
parser.add_argument('--modern', action="store_true", help="Install modern GCC version")

args = parser.parse_args()

SystemSetup(nop = args.nop, modern=args.modern).setup()
