#!/usr/bin/env bash
#
# Installs the default toolchains and components for different platforms.
# To use this script rustup must be installed first.

set -eu

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR/.."

source scripts/utils/log

ANDROID_TARGETS="x86_64-linux-android i686-linux-android aarch64-linux-android armv7-linux-androideabi"
ANDROID_COMPONENTS="rust-analyzer"

IOS_TARGETS="aarch64-apple-ios-sim aarch64-apple-ios x86_64-apple-ios"
IOS_COMPONENTS="rust-analyzer"

WINDOWS_TARGETS="x86_64-pc-windows-msvc x86_64-pc-windows-gnu i686-pc-windows-msvc"
WINDOWS_COMPONENTS="rust-analyzer"

LINUX_TARGETS="aarch64-unknown-linux-gnu x86_64-unknown-linux-gnu"
LINUX_COMPONENTS="rust-analyzer"

MACOS_TARGETS="aarch64-apple-darwin x86_64-apple-darwin"
MACOS_COMPONENTS="rust-analyzer"

function main {
    if [[ $# -eq 0 ]]; then
        print_usage
        exit 1
    fi

    case "$1" in
    # A previous version of this script didn't have individual options for the desktop platforms but
    # had only a single `desktop` option which we keep here for backwards compatibility.
    # Should be removed at a later point.
    "windows" | "desktop")
        setup "Windows" "$WINDOWS_TARGETS" "$WINDOWS_COMPONENTS"
        ;;
    "linux")
        setup "Linux" "$LINUX_TARGETS" "$LINUX_COMPONENTS"
        ;;
    "macos")
        setup "macOS" "$MACOS_TARGETS" "$MACOS_COMPONENTS"
        ;;
    "android")
        setup "Android" "$ANDROID_TARGETS" "$ANDROID_COMPONENTS"
        ;;
    "ios")
        setup "iOS" "$IOS_TARGETS" "$IOS_COMPONENTS"
        ;;
    "install-hook")
        install_hook
        ;;
    "--help")
        print_usage
        exit 0
        ;;
    *)
        log_error "Invalid argument: \`$1\`"
        print_usage
        exit 1
        ;;
    esac
}

function print_usage {
    log "Setup default Rust targets and components for different platforms"
    log ""
    log "Usage: setup-rust android|ios|windows|linux|macos|install-hook"
    log "  android                    Run Android-specific setup"
    log "  ios                        Run iOS-specific setup"
    log "  windows                    Run Windows-specific setup"
    log "  linux                      Run Linux-specific setup"
    log "  macos                      Run macOS-specific setup"
    log "  install-hook               Copies the setup-rust-post-checkout file to .git/hooks/post-checkout"
}

function setup {
    local platform=$1
    local targets=$2
    local components=$3

    log "Installing default Rust targets/components"
    log "platform: $platform"
    log "targets: $targets"
    log "components: $components"
    # shellcheck disable=SC2086
    rustup target add $targets
    # shellcheck disable=SC2086
    rustup component add $components
}

function install_hook {
    local hook=$SCRIPT_DIR/../.git/hooks/post-checkout
    if [[ -f "$hook" ]]; then
        log_error "$(realpath "$hook") file already exists - will not overwrite"
        exit 1
    else
        cp "$SCRIPT_DIR/setup-rust-post-checkout" "$hook"
        chmod +x "$hook"
        log "Hook installed. You must now set the environment variable MULLVAD_SETUP_PLATFORM to one of the following:"
        log "\`android\`, \`ios\`, \`windows\`, \`linux\`, \`macos\`"
    fi
}

# Run script
main "$@"
