#!/usr/bin/env bash

set -Eeuo pipefail

readonly ROOT_DIR="/mnt/lti-storage/MikroTik_Versions/routeros 7.x"
readonly BASE_URL="https://download.mikrotik.com/routeros"

usage() {
    printf 'Usage: %s VERSION\nExample: %s 7.24.2\n' "${0##*/}" "${0##*/}" >&2
}

if [[ $# -ne 1 ]]; then
    usage
    exit 2
fi

version=$1
if [[ ! $version =~ ^7\.[0-9]+(\.[0-9]+)?([._-][A-Za-z0-9]+)*$ ]]; then
    printf 'Error: invalid RouterOS 7.x version: %s\n' "$version" >&2
    exit 2
fi

if ! command -v curl >/dev/null 2>&1; then
    printf 'Error: curl is required. Install it with: sudo apt install curl\n' >&2
    exit 1
fi

destination="${ROOT_DIR}/${version}"
mkdir -p -- "$destination"

files=(
    "mikrotik-${version}-arm64.iso"
    "all_packages-arm64-${version}.zip"
    "mikrotik.mib"
    "flashfig.exe"
    "btest.exe"
    "dude-install-${version}.exe"
    "netinstall-${version}.tar.gz"
    "netinstall-${version}.zip"
    "netinstall64-${version}.zip"
    "routeros-${version}-arm.npk"
    "all_packages-arm-${version}.zip"
    "routeros-${version}-mipsbe.npk"
    "all_packages-mipsbe-${version}.zip"
    "routeros-${version}-mmips.npk"
    "all_packages-mmips-${version}.zip"
    "all_packages-ppc-${version}.zip"
    "routeros-${version}-ppc.npk"
    "routeros-${version}-smips.npk"
    "all_packages-smips-${version}.zip"
    "routeros-${version}-tile.npk"
    "all_packages-tile-${version}.zip"
    "routeros-${version}.npk"
    "install-image-${version}.zip"
    "mikrotik-${version}.iso"
    "all_packages-x86-${version}.zip"
)

printf 'Downloading RouterOS %s files to:\n%s\n\n' "$version" "$destination"

failed=()
for file in "${files[@]}"; do
    url="${BASE_URL}/${version}/${file}"
    printf 'Downloading %s\n' "$file"

    if ! curl \
        --fail \
        --location \
        --continue-at - \
        --retry 4 \
        --retry-delay 3 \
        --retry-all-errors \
        --output "${destination}/${file}" \
        "$url"; then
        failed+=("$file")
        printf 'FAILED: %s\n\n' "$url" >&2
    fi
done

if (( ${#failed[@]} > 0 )); then
    printf '\nCompleted with %d failed download(s):\n' "${#failed[@]}" >&2
    printf '  %s\n' "${failed[@]}" >&2
    exit 1
fi

printf '\nAll %d files downloaded successfully to %s\n' "${#files[@]}" "$destination"
