#!/bin/sh
set -e

REPO_URL="https://deb.fbxl.net/debian"
LIST_FILE="/etc/apt/sources.list.d/freebasic.list"

if [ "$(id -u)" -eq 0 ]; then
    SUDO=""
elif command -v sudo >/dev/null 2>&1; then
    SUDO="sudo"
else
    echo "Please run this script as root or install sudo." >&2
    exit 1
fi


disable_old_fbxl_sources() {
    cleanup_script="${TMPDIR:-/tmp}/freebasic-disable-old-apt-sources.$$"

    cat > "$cleanup_script" <<'FB_DISABLE_OLD_APT_SOURCES'
#!/bin/sh
set -eu

changed=0

rewrite_if_changed() {
    file=$1
    tmp=$2
    rc=$3

    if [ "$rc" -eq 10 ]; then
        cat "$tmp" > "$file"
        rm -f "$tmp"
        changed=1
        printf 'disabled old deb.fbxl.net source entries in %s\n' "$file"
        return 0
    fi

    rm -f "$tmp"
    return "$rc"
}

comment_list_file() {
    file=$1
    [ -f "$file" ] || return 0

    tmp="${file}.freebasic-new.$$"
    set +e
    perl -ne 'if (/deb\.fbxl\.net/ && !/^\s*#/) { print "# disabled by FreeBASIC installer: $_"; $changed=1 } else { print } END { exit($changed ? 10 : 0) }' "$file" > "$tmp"
    rc=$?
    set -e

    if [ "$rc" -eq 0 ]; then
        rm -f "$tmp"
        return 0
    fi

    rewrite_if_changed "$file" "$tmp" "$rc"
}

comment_sources_file() {
    file=$1
    [ -f "$file" ] || return 0

    tmp="${file}.freebasic-new.$$"
    set +e
    perl -0pe '
        BEGIN { $changed = 0; }
        @parts = split(/(\n[ \t]*\n)/, $_, -1);
        for ($i = 0; $i < @parts; $i += 2) {
            if ($parts[$i] =~ /^(?![ \t]*#).*deb\.fbxl\.net/m) {
                $parts[$i] =~ s/^([ \t]*)(?!#)(\S[^\n]*)/$1# disabled by FreeBASIC installer: $2/mg;
                $changed = 1;
            }
        }
        $_ = join("", @parts);
        END { exit($changed ? 10 : 0); }
    ' "$file" > "$tmp"
    rc=$?
    set -e

    if [ "$rc" -eq 0 ]; then
        rm -f "$tmp"
        return 0
    fi

    rewrite_if_changed "$file" "$tmp" "$rc"
}

for file in /etc/apt/sources.list /etc/apt/sources.list.d/*.list; do
    comment_list_file "$file"
done

for file in /etc/apt/sources.list.d/*.sources; do
    comment_sources_file "$file"
done
FB_DISABLE_OLD_APT_SOURCES

    chmod 755 "$cleanup_script"
    if $SUDO sh "$cleanup_script"; then
        rm -f "$cleanup_script"
    else
        cleanup_status=$?
        rm -f "$cleanup_script"
        return "$cleanup_status"
    fi
}

if command -v lsb_release >/dev/null 2>&1; then
    CODENAME=$(lsb_release -cs)
else
    . /etc/os-release
    CODENAME=${VERSION_CODENAME:-${UBUNTU_CODENAME:-}}
fi

if [ -z "$CODENAME" ]; then
    echo "Could not determine Debian/Ubuntu codename" >&2
    exit 1
fi

ARCH=$(dpkg --print-architecture)
echo "Using FreeBASIC repo for $CODENAME/$ARCH"
echo "Disabling old deb.fbxl.net apt source entries"
disable_old_fbxl_sources
printf 'deb [trusted=yes arch=%s] %s %s main\n' "$ARCH" "$REPO_URL" "$CODENAME" | $SUDO tee "$LIST_FILE" >/dev/null
$SUDO apt update
$SUDO apt install -y freebasic-full
