#!/bin/bash
#
#  Copyright (c) 2017, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#
#    Description:
#      This file installs all needed dependencies and toolchains needed for
#      example compilation and programming.
#

set -euxo pipefail

install_packages_apt()
{
    echo 'Installing toolchain dependencies...'

    # apt-get update and install dependencies
    sudo apt-get update
    sudo apt-get --no-install-recommends install -y automake g++ libtool lsb-release make cmake ninja-build shellcheck

    echo 'Installing GNU Arm Embedded Toolchain...'

    PLATFORM=$(lsb_release -is)
    RELEASE=$(lsb_release -rs)
    UBUNTU2004=20.04

    if [ "$PLATFORM" = "Raspbian" ]; then
        sudo apt-get --no-install-recommends install -y binutils-arm-none-eabi gcc-arm-none-eabi gdb-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib
    elif [ "$PLATFORM" = "Ubuntu" ] && [[ ! $RELEASE < $UBUNTU2004 ]]; then
        echo "Ubuntu Release >= $UBUNTU2004"
        # no need to use ppa
        sudo apt-get --no-install-recommends install -y gcc-arm-none-eabi gdb-multiarch libnewlib-arm-none-eabi
    elif ! command -v arm-none-eabi-g++; then
        # add gcc-arm-embedded ppa
        sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa -y
        sudo apt-get update
        sudo apt-get --no-install-recommends install -y gcc-arm-embedded
    fi

    echo 'Installing pretty tools useful for code contributions...'

    # add clang-format for pretty
    sudo apt-get --no-install-recommends install -y clang-format-6.0

    # add yapf for pretty
    python3 -m pip install yapf==0.29.0 || echo 'WARNING: could not install yapf, which is useful if you plan to contribute python code to the OpenThread project.'

    # add mdv for local size report
    python3 -m pip install mdv || echo 'WARNING: could not install mdv, which is useful if you plan to contribute markdown to the OpenThread project.'

    # add shfmt for shell pretty, try brew only because snap does not support home directory not being /home and doesn't work in docker.
    command -v shfmt || brew install shfmt || echo 'WARNING: could not install shfmt, which is useful if you plan to contribute shell scripts to the OpenThread project.'
}

install_packages_opkg()
{
    echo 'opkg not supported currently' && false
}

install_packages_rpm()
{
    echo 'rpm not supported currently' && false
}

install_packages_brew()
{
    echo 'Installing toolchain dependencies...'

    # add build tools
    brew install automake libtool cmake ninja shfmt shellcheck

    echo 'Installing GNU Arm Embedded Toolchain...'

    # add ARM toolchain
    brew tap ArmMbed/homebrew-formulae
    brew install arm-none-eabi-gcc

    # check for gcc for simulation
    if ! command -v gcc; then
        echo 'warning: clang/gcc needed for simulation'
        echo 'warning: please install Command Line Tools from https://developer.apple.com/download/more/'
    fi

    echo 'Installing pretty tools useful for code contributions...'

    # add clang-format for pretty
    CLANG_FORMAT_VERSION="clang-format version 6.0"
    command -v clang-format-6.0 || (command -v clang-format && (clang-format --version | grep -q "${CLANG_FORMAT_VERSION}")) || {
        brew install llvm@6
        sudo ln -s "$(brew --prefix llvm@6)/bin/clang-format" /usr/local/bin/clang-format-6.0
    }

    # add yapf for pretty
    python3 -m pip install yapf || echo 'Failed to install python code formatter yapf. Install it manually if you need.'
}

install_packages_source()
{
    echo 'source not supported currently' && false
}

install_packages()
{
    PM=source
    if command -v apt-get; then
        PM=apt
    elif command -v rpm; then
        PM=rpm
    elif command -v opkg; then
        PM=opkg
    elif command -v brew; then
        PM=brew
    fi
    install_packages_$PM
}

main()
{
    install_packages
    echo 'bootstrap completed successfully.'
}

main
