#!/bin/bash

# Copyright 2016 Matthew Thode
#
# 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
#
#     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.

if [[ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]]; then
    set -x
fi
set -eu
set -o pipefail

# env is not sourced with user specified package inclusions
# set the default bash array if GENTOO_EMERGE_ENV is not defined as an array
if ! declare -p GENTOO_EMERGE_ENV  2> /dev/null | grep -q '^declare \-a'; then
    declare -a GENTOO_EMERGE_ENV
    GENTOO_EMERGE_ENV+=("USE=\"-build\"")
    GENTOO_EMERGE_ENV+=("FEATURES=\"binpkg-multi-instance buildpkg parallel-fetch parallel-install\"")
    GENTOO_EMERGE_ENV+=("PKGDIR=\"/tmp/portage-pkgdir\"")
    GENTOO_EMERGE_ENV+=("DISTDIR=\"/tmp/portage-distdir\"")
    GENTOO_EMERGE_ENV+=("PORTDIR=\"/tmp/portage-portdir\"")
    export GENTOO_EMERGE_ENV
fi
# iterate over the array, exporting each 'line'
for (( i=0; i<${#GENTOO_EMERGE_ENV[@]}; i++ )); do
    eval export "${GENTOO_EMERGE_ENV[i]}"
done
# set default opts
GENTOO_EMERGE_DEFAULT_OPTS=${GENTOO_EMERGE_DEFAULT_OPTS:-"--binpkg-respect-use --rebuilt-binaries=y --usepkg=y --with-bdeps=y --binpkg-changed-deps=y --quiet --jobs=2 --autounmask=n"}

ACTION='install'

SCRIPTNAME="$(basename $0)"
function show_options {
    echo "Usage: ${SCRIPTNAME} [package ...]"
    echo
    echo 'Options:'
    echo '    -u          -- update all packages'
    echo '    -e          -- erase/remove packages'
    exit 0
}

function install_gentoo_packages {
    RUN_ONCE_SHM='1'
    if mountpoint -q /dev/shm; then
        emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
    elif [[ -k /dev/shm ]]; then
        emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
    else
        fix_shm
        emerge ${GENTOO_EMERGE_DEFAULT_OPTS} $@
        unfix_shm
    fi
}

TEMP="$(getopt -o huem: -n ${SCRIPTNAME} -- ${@})"
if [[ "${?}" != 0 ]]; then
    echo 'Terminating...' >&2
    exit 1
fi
eval set -- "${TEMP}"

while true; do
    case "${1}" in
        -u )
            if [[ ! -f ${PORTDIR}/profiles ]]; then
                emerge-webrsync -q
            fi
            install_gentoo_packages --update --deep --newuse --complete-graph=y @world
            install_gentoo_packages --verbose=n --depclean
            install_gentoo_packages --usepkg=n @preserved-rebuild
            etc-update --automode -5
            eselect news read new
            exit 0;
            ;;
        -e )
            ACTION='remove'
            shift
            ;;
        -m )
            MAP_ELEMENT="${2}"
            shift 2
            ;;
        -h )
            show_options
            ;;
        -- )
            shift
            break
            ;;
        * )
            echo "Error: unsupported option ${1}."
            exit 1
            ;;
    esac
done

PKGS="${@}"
if [[ -n "${MAP_ELEMENT:-}" ]]; then
    PKGS="$(pkg-map --element ${MAP_ELEMENT} ${@})"
    if [[ "${?}" != 0 ]]; then
        echo "bin/pkg-map error. ${PKGS}"
        exit 1
    fi
fi

if [[ -z "${PKGS}" ]]; then
    echo "Not running install-packages ${ACTION} with empty packages list"
else
    if [[ "${ACTION}" == 'install' ]]; then
        if [[ ! -f ${PORTDIR}/profiles ]]; then
            emerge-webrsync -q
        fi
        install_gentoo_packages -q --jobs=2 --changed-use "${PKGS}"
    elif [[ "${ACTION}" == 'remove' ]]; then
        if [[ ! -f ${PORTDIR}/profiles ]]; then
            emerge-webrsync -q
        fi
        install_gentoo_packages -C "${PKGS}"
    else
        echo 'something when really wrong, install action is not install or remove'
    fi
fi
