#!/bin/bash
echo "---------- $0 start ----------"
set -e
set -x

if [ $EUID == 0 ]; then
    echo "Please do not run this script as root; don't sudo it!"
    exit 1
fi

if [[ $SHELL == *"zsh"* ]]; then
    AP_COMPLETION_SCR="completion.zsh"
    SHELL_LOGIN=".zshrc"
elif [[ $SHELL == *"bash"* ]]; then
    AP_COMPLETION_SCR="completion.bash"
    SHELL_LOGIN=".bash_profile"
else
    echo "Unsupported shell"
    exit 1
fi

OPT="/opt"
# Ardupilot Tools
ARDUPILOT_TOOLS="Tools/autotest"

ASSUME_YES=false
sep="##############################################"

OPTIND=1  # Reset in case getopts has been used previously in the shell.
while getopts "y" opt; do
    case "$opt" in
        \?)
            exit 1
            ;;
        y)  ASSUME_YES=true
            ;;
    esac
done


echo "Checking homebrew..."
$(which -s brew) ||
{
    echo "installing homebrew..."
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
} 
echo "Homebrew installed"

#install command line tools
echo "Checking CLI Tools installed..."
{
    ERROR=$(xcode-select --install 2>&1 > /dev/null)
} ||
{
if [[ $ERROR != *"command line tools are already installed"* ]]; then
    echo "$ERROR" 1>&2
    exit 1
fi
}

# ArduPilot official Toolchain for STM32 boards
function install_arm_none_eabi_toolchain() {
    # GNU Tools for ARM Embedded Processors
    # (see https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)
    ARM_ROOT="gcc-arm-none-eabi-10-2020-q4-major"
    ARM_TARBALL="$ARM_ROOT-mac.tar.bz2"
    ARM_TARBALL_URL="https://firmware.ardupilot.org/Tools/STM32-tools/$ARM_TARBALL"
    if [ ! -d $OPT/$ARM_ROOT ]; then
        (
            cd $OPT;
            echo "Installing toolchain for STM32 Boards"
            echo "Downloading from ArduPilot server"
            sudo wget $ARM_TARBALL_URL
            echo "Installing..."
            sudo tar xjf ${ARM_TARBALL}
            echo "... Cleaning"
            sudo rm ${ARM_TARBALL};
        )
    fi
    echo "Registering STM32 Toolchain for ccache"
    sudo ln -s -f $CCACHE_PATH /usr/local/opt/ccache/libexec/arm-none-eabi-g++
    sudo ln -s -f $CCACHE_PATH /usr/local/opt/ccache/libexec/arm-none-eabi-gcc
    echo "Done!"
}

function maybe_prompt_user() {
    if $ASSUME_YES; then
        return 0
    else
        read -p "$1"
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            return 0
        else
            return 1
        fi
    fi
}

# delete links installed by github in /usr/local/bin; installing or
# upgrading python via brew fails if these links are in place.  brew
# auto-updates things when you install other packages which depend on
# more recent versions.
# see https://github.com/orgs/Homebrew/discussions/3895
find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete

brew update
brew install gawk curl coreutils wget

PIP=pip
if maybe_prompt_user "Install python using pyenv [N/y]?" ; then
    echo "Checking pyenv..."
    {
        $(which -s pyenv)
    } ||
    {
        echo "Installing pyenv"
        curl https://pyenv.run | bash

        pushd $HOME/.pyenv
        git fetch --tags
        git checkout v2.3.12
        popd
        exportline="export PYENV_ROOT=\$HOME/.pyenv"
        echo $exportline >> ~/$SHELL_LOGIN
        exportline="export PATH=\$PYENV_ROOT/bin:\$PATH"
        echo $exportline >> ~/$SHELL_LOGIN
        evalline="eval \"\$(pyenv init --path)\""
        echo $evalline >> ~/$SHELL_LOGIN
        evalline="eval \"\$(pyenv init -)\""
        echo $evalline >> ~/$SHELL_LOGIN
        source ~/$SHELL_LOGIN
    }
    echo "pyenv installed"
    {
        $(pyenv global 3.10.4)
    } || {
        env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.10.4
        pyenv global 3.10.4
    }
fi


if [[ -z "${DO_AP_STM_ENV}" ]] && maybe_prompt_user "Install ArduPilot STM32 toolchain [N/y]?" ; then
    DO_AP_STM_ENV=1
fi

echo "Checking ccache..."
{
    $(which -s ccache)
} ||
{
    brew install ccache
    exportline="export PATH=/usr/local/opt/ccache/libexec:\$PATH";
    eval $exportline
}
CCACHE_PATH=$(which ccache)

if [[ $DO_AP_STM_ENV -eq 1 ]]; then
    install_arm_none_eabi_toolchain
fi

PYTHON_PKGS="future lxml pymavlink MAVProxy pexpect geocoder flake8 empy dronecan"
# add some Python packages required for commonly-used MAVProxy modules and hex file generation:
if [[ $SKIP_AP_EXT_ENV -ne 1 ]]; then
    PYTHON_PKGS="$PYTHON_PKGS intelhex gnureadline"
fi
# add some packages required for commonly-used MAVProxy modules:
if [[ $SKIP_AP_GRAPHIC_ENV -ne 1 ]]; then
    PYTHON_PKGS="$PYTHON_PKGS wxPython billiard"
fi

$PIP install --upgrade pip
$PIP install wheel
$PIP install $PYTHON_PKGS

echo "Adding ArduPilot Tools to environment"

SCRIPT_DIR=$(dirname $(grealpath ${BASH_SOURCE[0]}))
ARDUPILOT_ROOT=$(grealpath "$SCRIPT_DIR/../../")

if [[ $DO_AP_STM_ENV -eq 1 ]]; then
exportline="export PATH=$OPT/$ARM_ROOT/bin:\$PATH";
grep -Fxq "$exportline" ~/$SHELL_LOGIN 2>/dev/null || {
    if maybe_prompt_user "Add $OPT/$ARM_ROOT/bin to your PATH [N/y]?" ; then
        echo $exportline >> ~/$SHELL_LOGIN
        eval $exportline
    else
        echo "Skipping adding $OPT/$ARM_ROOT/bin to PATH."
    fi
}
fi

exportline2="export PATH=$ARDUPILOT_ROOT/$ARDUPILOT_TOOLS:\$PATH";
grep -Fxq "$exportline2" ~/$SHELL_LOGIN 2>/dev/null || {
    if maybe_prompt_user "Add $ARDUPILOT_ROOT/$ARDUPILOT_TOOLS to your PATH [N/y]?" ; then
        echo $exportline2 >> ~/$SHELL_LOGIN
        eval $exportline2
    else
        echo "Skipping adding $ARDUPILOT_ROOT/$ARDUPILOT_TOOLS to PATH."
    fi
}

if [[ $SKIP_AP_COMPLETION_ENV -ne 1 ]]; then
exportline3="source $ARDUPILOT_ROOT/Tools/completion/$AP_COMPLETION_SCR";
grep -Fxq "$exportline3" ~/$SHELL_LOGIN 2>/dev/null || {
    if maybe_prompt_user "Add ArduPilot Bash Completion to your bash shell [N/y]?" ; then
        echo $exportline3 >> ~/$SHELL_LOGIN
        eval $exportline3
    else
        echo "Skipping adding ArduPilot Bash Completion."
    fi
}
fi

exportline4="export PATH=/usr/local/opt/ccache/libexec:\$PATH";
grep -Fxq "$exportline4" ~/$SHELL_LOGIN 2>/dev/null || {
    if maybe_prompt_user "Append CCache to your PATH [N/y]?" ; then
        echo $exportline4 >> ~/$SHELL_LOGIN
        eval $exportline4
    else
        echo "Skipping appending CCache to PATH."
    fi
}
echo "Done!"

git submodule update --init --recursive

echo "finished"