#!/data/data/com.termux/files/usr/bin/bash

# Setup TERMUX_APP_PACKAGE_MANAGER
source "/data/data/com.termux/files/usr/bin/termux-setup-package-manager" || exit 1

MIRROR_BASE_DIR="/data/data/com.termux/files/usr/etc/termux/mirrors"

if [ "$1" == "--help" ] || [ "$1" == "-help" ]; then
    echo "Script for choosing a group of mirrors to use."
    echo "All mirrors are listed at"
    echo "https://github.com/termux/termux-packages/wiki/Mirrors"
    exit 0
fi

unlink_and_link() {
    MIRROR_GROUP="$1"
    if [ -L "/data/data/com.termux/files/usr/etc/termux/chosen_mirrors" ]; then
        unlink "/data/data/com.termux/files/usr/etc/termux/chosen_mirrors"
    fi
    ln -s "${MIRROR_GROUP}" "/data/data/com.termux/files/usr/etc/termux/chosen_mirrors"
}

select_repository_group() {
    MIRRORS=()
    MIRRORS+=("All mirrors" "All in the entire world" "on")
    MIRRORS+=("Mirrors in Asia" "All in Asia (excl. Chinese Mainland and Russia)" "off")
    MIRRORS+=("Mirrors in Chinese Mainland" "All in Chinese Mainland" "off")
    MIRRORS+=("Mirrors in Europe" "All in Europe" "off")
    MIRRORS+=("Mirrors in North America" "All in North America" "off")
    MIRRORS+=("Mirrors in Oceania" "All in Oceania" "off")
    MIRRORS+=("Mirrors in Russia" "All in Russia" "off")

    local TEMPFILE="$(mktemp /data/data/com.termux/files/usr/tmp/mirror.XXXXXX)"
    dialog \
        --title "termux-change-repo" --clear \
        --radiolist "Which group of mirrors do you want to use? Select with space." 0 0 0 \
        "${MIRRORS[@]}" --and-widget \
        2> "$TEMPFILE"
    retval=$?
    clear

    case $retval in
        1)
            # Cancel pressed
            exit
            ;;
        255)
            # Esc pressed
            exit
            ;;
    esac

    mirror_group="$(cat "$TEMPFILE")"
    rm "$TEMPFILE"

    if [ "$mirror_group" == "Mirrors in Asia" ]; then
        echo "[*] Mirrors in Asia (excl. Chinese Mainland and Russia) selected"
        unlink_and_link ${MIRROR_BASE_DIR}/asia

    elif [ "$mirror_group" == "Mirrors in Chinese Mainland" ]; then
        echo "[*] Mirrors in Chinese Mainland selected"
        unlink_and_link ${MIRROR_BASE_DIR}/chinese_mainland

    elif [ "$mirror_group" == "Mirrors in Europe" ]; then
        echo "[*] Mirrors in Europe selected"
        unlink_and_link ${MIRROR_BASE_DIR}/europe

    elif [ "$mirror_group" == "Mirrors in North America" ]; then
        echo "[*] Mirrors in North America selected"
        unlink_and_link ${MIRROR_BASE_DIR}/north_america

    elif [ "$mirror_group" == "Mirrors in Oceania" ]; then
        echo "[*] Mirrors in Oceania selected"
        unlink_and_link ${MIRROR_BASE_DIR}/oceania

    elif [ "$mirror_group" == "Mirrors in Russia" ]; then
        echo "[*] Mirrors in Russia selected"
        unlink_and_link ${MIRROR_BASE_DIR}/russia

    elif [ "$mirror_group" == "All mirrors" ]; then
        echo "[*] All mirrors selected"
        unlink_and_link ${MIRROR_BASE_DIR}/all

    else
        echo "[!] Error: unknown mirror group: '$1'. Exiting"
        exit 1
    fi
}

get_mirror_url() {
    basename "$1"
}

get_mirror_description() {
    head -n 2 "$1" | tail -n 1 | cut -d" " -f2-
}

select_individual_mirror() {
    mirrors=($(find ${MIRROR_BASE_DIR}/{asia,chinese_mainland,europe,north_america,oceania,russia}/ -type f ! -name "*\.dpkg-old" ! -name "*\.dpkg-new" ! -name "*~"))

    # Choose default mirror per default
    MIRRORS=("$(get_mirror_url "${MIRROR_BASE_DIR}/default")" "$(get_mirror_description "${MIRROR_BASE_DIR}/default")" "on")
    # Special handling of packages.termux.dev mirror to put it on top:
    MIRRORS+=("$(get_mirror_url "${MIRROR_BASE_DIR}/europe/packages.termux.dev")" "$(get_mirror_description "${MIRROR_BASE_DIR}/europe/packages.termux.dev")" "off")
    for mirror in ${mirrors[@]}; do
        mirror_url=$(get_mirror_url "$mirror")
        if [ "$mirror_url" == "packages.termux.dev" ]; then continue; fi
        MIRRORS+=("$mirror_url" "$(get_mirror_description "$mirror")" "off")
    done

    local TEMPFILE="$(mktemp /data/data/com.termux/files/usr/tmp/mirror.XXXXXX)"
    dialog \
        --title "termux-change-repo" --clear \
        --radiolist "Which mirror do you want to use? Select with space." 0 0 0 \
        "${MIRRORS[@]}" --and-widget \
        2> "$TEMPFILE"
    retval=$?
    clear

    case $retval in
        1)
            # Cancel pressed
            exit
            ;;
        255)
            # Esc pressed
            exit
            ;;
    esac

    mirror="$(cat "$TEMPFILE")"

    echo "[*] Mirror $(get_mirror_url "$mirror") selected"
    unlink_and_link "$(find ${MIRROR_BASE_DIR} -name $mirror)"
    rm "$TEMPFILE"
}

usage() {
   echo "Usage: termux-change-repo"
   echo ""
   echo "termux-change-repo is a utility used to simplify which mirror(s)"
   echo "pkg (our apt wrapper) should use."
}

if [ $# -gt 0 ]; then
    usage
fi

if ! command -v apt 1>/dev/null; then
    echo "Error: Cannot change mirrors since apt is not installed." >&2
    exit 1
fi

if [ "$TERMUX_APP_PACKAGE_MANAGER" = "pacman" ]; then
    read -p "Warning: termux-change-repo can only change mirrors for apt, is that what you intended? [y|n] " -n 1 -r
    echo
    [[ ${REPLY} =~ ^[Nn]$ ]] && exit
fi

mkdir -p "/data/data/com.termux/files/usr/tmp" || exit $?

TEMPFILE="$(mktemp /data/data/com.termux/files/usr/tmp/termux-change-repo.XXXXXX)"

MODES=()
MODES+=("Mirror group" "Rotate between several mirrors (recommended)" "on")
MODES+=("Single mirror" "Choose a single mirror to use" "off")
dialog \
    --title "termux-change-repo" --clear \
    --radiolist "Do you want to choose a mirror group or a single mirror? Select with space." 0 0 0 \
    "${MODES[@]}" --and-widget \
    2> "$TEMPFILE"
retval=$?
clear

case $retval in
    0)
        case "$(cat $TEMPFILE)" in
        "Mirror group")
            select_repository_group
            ;;
        "Single mirror")
            select_individual_mirror
            ;;
        esac
        ;;
    1)
        # Cancel pressed
        exit
        ;;
    255)
        # Esc pressed
        exit
        ;;
esac

rm "$TEMPFILE"

echo "[*] pkg --check-mirror update"
TERMUX_APP_PACKAGE_MANAGER=apt pkg --check-mirror update
