#!/bin/bash
#
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

APT_PACKAGES=(
    asciidoctor
    bison
    build-essential
    ccache
    clang
    clang-format
    cmake
    cmake-curses-gui
    cpio
    curl
    device-tree-compiler
    doxygen
    flex
    fzf
    gdb
    git
    gtk-sharp2
    graphviz
    haskell-stack
    lcov
    libcanberra-gtk-module
    libclang-dev
    libcunit1-dev
    libc6-dev gcc g++
    libftdi1
    libftdi1-dev
    libfl2
    libfl-dev
    libglib2.0-dev
    libglib2.0-dev-bin
    libgtk2.0-0
    libpixman-1-dev
    libsqlite3-dev
    libssl-dev
    libtinfo-dev
    libtinfo5
    libwww-perl
    libxml2-dev
    libxml2-utils
    libxslt-dev
    libzmq5
    lrzsz
    mono-complete
    ncurses-dev
    ninja-build
    perl
    protobuf-compiler
    pv
    python3-protobuf
    python3
    python3-dev
    python3-pip
    rsync
    srecord
    texinfo
    texlive-bibtex-extra
    texlive-fonts-recommended
    texlive-latex-extra
    texlive-metapost
    u-boot-tools
    uml-utilities
    policykit-1
    screen
    wget
    zlibc
    zlib1g
    zlib1g-dev
)

PYTHON3_PACKAGES=(
    camkes-deps
    hjson
    mako
    matplotlib
    meson==0.54.0
    netifaces
    pandas
    psutil
    pyfzf
    pyyaml
    requests
    robotframework==4.0.1
    sel4-deps
    setuptools
    tempita
    wget
)

function die {
    [[ ! -z "$@" ]] && echo "$@"
    exit 1
}

function try {
    "$@" || die
}

function sudo_try {
    echo "sudo $@"
    sudo "$@" || die
}

function try_install_apt_packages {
    sudo_try apt-get update
    sudo_try apt-get install -y "${APT_PACKAGES[@]}"
    sed 's/#.*//' ${ROOTDIR}/hw/opentitan-upstream/apt-requirements.txt | sudo_try xargs apt-get install -y
}

function try_install_python_packages {
    local package

    if ! pip >/dev/null && ! apt-get install python-pip; then
        echo
        echo "Seems like you're on a newer distro that doesn't include pip for python2"
        echo "Please run the following and re-run the prereqs target:"
        echo
        echo "  curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py"
        echo "  chmod +x get-pip.py"
        echo "  ./get-pip.py"
        die
    fi

    for package in "${PYTHON3_PACKAGES[@]}"; do
        try pip3 install "${package}"
    done

    pushd ${ROOTDIR}/toolchain/tockloader
        pip3 install -e .
    popd

    pip3 install -r ${ROOTDIR}/hw/opentitan-upstream/python-requirements.txt
}

echo "Installing apt package dependencies..."
try_install_apt_packages

echo "Installing python package dependencies..."
try_install_python_packages

echo "Installation complete."
