#!/usr/bin/env bash

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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
#
#   http://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.

# This shell script installs all OS package dependencies for Apache
# CouchDB 2.x for deb-based systems.
#
# While these scripts are primarily written to support building CI
# Docker images, they can be used on any workstation to install a
# suitable build environment.

# stop on error
set -e

# TODO: support Mint, Devuan, etc.

# Check if running as root
if [[ ${EUID} -ne 0 ]]; then
  echo "Sorry, this script must be run as root."
  echo "Try: sudo $0 $*"
  exit 1
fi

# install lsb-release
apt-get update && apt-get install -y lsb-release

SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. ${SCRIPTPATH}/detect-arch.sh >/dev/null
. ${SCRIPTPATH}/detect-os.sh >/dev/null
debians='(wheezy|jessie|stretch|buster)'
ubuntus='(precise|trusty|xenial|artful|bionic)'
echo "Detected Ubuntu/Debian version: ${VERSION_CODENAME}   arch: ${ARCH}"

# bionic Docker image seems to be missing /etc/timezone...
if [[ ! -f /etc/timezone ]]; then
  rm -f /etc/localtime
  ln -snf /usr/share/zoneinfo/Etc/UTC /etc/localtime
  echo "Etc/UTC" > /etc/timezone
  chmod 0644 /etc/timezone
  apt-get install -y tzdata
  export TZ=Etc/UTC
fi

# Upgrade all packages
apt-get -y dist-upgrade

# install build-time dependencies
if [[ ${VERSION_CODENAME} == "trusty" ]]; then
  VENV=python3.4-venv
else
  VENV=python3-venv
fi

# build deps, doc build deps, pkg building, then userland helper stuff
apt-get install -y apt-transport-https curl git pkg-config \
    python3 libpython3-dev python3-setuptools python3-pip ${VENV} \
    sudo wget zip unzip \
    build-essential ca-certificates libcurl4-openssl-dev \
    libicu-dev libnspr4-dev \
    help2man python3-sphinx \
    curl debhelper devscripts dh-exec dh-python equivs \
    dialog equivs lintian libwww-perl quilt \
    reprepro createrepo \
    vim-tiny screen \

# Node.js
if [ "${ARCH}" != "ppc64le" ] || [ "${VERSION_CODENAME}" != "buster" ]; then
  pushd /tmp
  wget https://deb.nodesource.com/setup_${NODEVERSION}.x
  /bin/bash setup_${NODEVERSION}.x
  apt-get install -y nodejs
  rm setup_${NODEVERSION}.x
  if [ -z "$(which node)" ]; then
    apt-get purge -y nodejs || true
    # extracting the right version to dl is a pain :(
    node_filename="$(curl -s https://nodejs.org/dist/latest-v${NODEVERSION}.x/SHASUMS256.txt | grep linux-${ARCH}.tar.gz | cut -d ' ' -f 3)"
    wget https://nodejs.org/dist/latest-v${NODEVERSION}.x/${node_filename}
    tar --directory=/usr --strip-components=1 -xzf ${node_filename}
    rm ${node_filename}
    # then, fake a package install
    cat << EOF > nodejs-control
Section: misc
Priority: optional
Standards-Version: 3.9.2
Package: nodejs
Provides: nodejs
Version: ${NODEVERSION}.99.99
Description: Fake nodejs package to appease package builder
EOF
    equivs-build nodejs-control
    apt-get install -y ./nodejs*.deb
    rm nodejs-control nodejs*deb
  fi
  npm install npm@latest -g
  popd
fi
# fix for broken sphinx on ubuntu 12.04 only
if [[ ${VERSION_CODENAME} == "precise" ]]; then
  pip3 --default-timeout=1000 install docutils==0.13.1 sphinx==1.5.3 typing
fi

# rest of python dependencies
pip3 --default-timeout=10000 install --upgrade sphinx_rtd_theme nose requests hypothesis==3.79.0

# install dh-systemd if available
if [[ ${VERSION_CODENAME} != "precise" ]]; then
  apt-get install -y dh-systemd
fi

# relaxed lintian rules for CouchDB
mkdir -p /usr/share/lintian/profiles/couchdb
chmod 0755 /usr/share/lintian/profiles/couchdb
if [[ ${VERSION_CODENAME} =~ ${debians} ]]; then
  cp ${SCRIPTPATH}/../files/debian.profile /usr/share/lintian/profiles/couchdb/main.profile
  if [[ ${VERSION_CODENAME} == "jessie" ]]; then
    # remove unknown lintian rule privacy-breach-uses-embedded-file
    sed -i -e 's/, privacy-breach-uses-embedded-file//' /usr/share/lintian/profiles/couchdb/main.profile
    # add rule to suppress python-script-but-no-python-dep
    sed -i -e 's/Disable-Tags: /Disable-Tags: python-script-but-no-python-dep, /' /usr/share/lintian/profiles/couchdb/main.profile
  fi
elif [[ ${VERSION_CODENAME} =~ ${ubuntus} ]]; then
  cp ${SCRIPTPATH}/../files/ubuntu.profile /usr/share/lintian/profiles/couchdb/main.profile
  if [[ ${VERSION_CODENAME} == "xenial" ]]; then
    # add rule to suppress python-script-but-no-python-dep
    sed -i -e 's/Disable-Tags: /Disable-Tags: python-script-but-no-python-dep, /' /usr/share/lintian/profiles/couchdb/main.profile
  fi
else
  echo "Unrecognized Debian-like release: ${VERSION_CODENAME}! Skipping lintian work."
fi

MAINPROFILE=/usr/share/lintian/profiles/couchdb/main.profile
if [[ -e ${MAINPROFILE} ]]; then
    chmod 0644 ${MAINPROFILE}
fi

# js packages, as long as we're not told to skip them
if [[ $1 != "nojs" ]]; then
  # config the CouchDB repo & install the JS packages
  echo "deb https://apache.bintray.com/couchdb-deb ${VERSION_CODENAME} main" | \
      sudo tee /etc/apt/sources.list.d/couchdb.list
  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys \
      8756C4F765C9AC3CB6B85D62379CE192D401AB61
  apt-get update && apt-get install -y couch-libmozjs185-dev
  if [ "${VERSION_CODENAME}" == "buster" ]; then
    apt-get install -y libmozjs-60-dev
  fi
else
  # install js build-time dependencies only
  # we can't add the CouchDB repo here because the plat may not exist yet
  apt-get install -y libffi-dev pkg-kde-tools autotools-dev
fi

# Erlang is installed by apt-erlang.sh

# clean up
apt-get clean
