#!/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
import re
import tempfile
import urllib.request

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

GDB_RELEASES_URL = "https://sourceware.org/pub/gdb/releases"
GDB_VERSION=13.2

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

class GDBSetup(paella.Setup):
    def __init__(self, args):
        paella.Setup.__init__(self, nop=args.nop)

    def common_first(self):
        self.install("gdb")

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

class GDBSetupModern(paella.Setup):
    def __init__(self, args):
        paella.Setup.__init__(self, nop=args.nop)
        self.modern = args.modern
        self.keep = args.keep
        self.prefix = "/usr/local"

        if self.os == 'macos' and self.arch == 'arm64v8':
            fatal("GDB is not supported on macOS/M1")

    def get_gdb(self):
        self.base_dir = tempfile.mkdtemp(prefix='gdb.')
        print(f'# work dir: {self.base_dir}')
        print(f'# getting gdb from {GDB_RELEASES_URL}/gdb-{GDB_VERSION}.tar.gz')
        gdb_tgz = paella.wget(f"{GDB_RELEASES_URL}/gdb-{GDB_VERSION}.tar.gz",
                              dest=f'{self.base_dir}/gdb.tgz')
        self.run(f'tar -C {self.base_dir} -xzf {gdb_tgz}')
    
    def common_first(self):
        self.install_downloaders()
        self.get_gdb()

    def debian_compat(self):
        self.run(f"{HERE}/getgcc")
        self.install("libgmp-dev libexpat-dev guile-3.0 libticonv-dev liblzma-dev \
                      libmpfr-dev zlib1g-dev flex bison texinfo libncurses-dev")

    def redhat_compat(self):
        self.run("{pwd}/getgcc --modern".format(pwd=HERE))
        self.install("gmp-devel expat-devel guile30 libticonv-devel xz-devel \
                      mpfr-devel zlib-devel flex bison texinfo ncurses-devel")

    def fedora(self):
        self.redhat_compat()

    def archlinux(self):
        self.run(f"{HERE}/getgcc")
        self.install("make gmp expat guile libiconv xz mpfr zlib flex bison texinfo ncurses")

    def macos(self):
        self.prefix = os.path.abspath(os.path.expanduser("~/.local"))
        self.run(f"{HERE}/getgcc")
        self.install("make gmp expat guile libiconv xz mpfr zlib flex bison texinfo ncurses")

    def common_last(self):
        self.run(f"""
            cd {self.base_dir}
            mkdir -p build
            cd build
            ../gdb-{GDB_VERSION}/configure --prefix="{self.prefix}" --enable-tui=yes
            make -j
            make install
            """)
        if not self.keep:
            paella.rm_rf(self.base_dir)

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

parser = argparse.ArgumentParser(description='Install GDB.')
parser.add_argument('-n', '--nop', action="store_true", help='No operation')
parser.add_argument('--modern', action="store_true", help='Install latest gdb')
parser.add_argument('--keep', action="store_true", help="Do not remove source files and build artifacts")
args = parser.parse_args()

if args.modern:
    GDBSetupModern(args).setup()
else:
    GDBSetup(args).setup()
