#!/bin/bash

set -u
set -e

bold=$(tput -T ${TERM:-xterm} bold)
normal=$(tput -T ${TERM:-xterm} sgr0)


PYTHON_BIN='python3'

function help () {
    if [[ $# -gt 1 ]]; then
        CMD="print_${2}_help"
        $CMD
    else
        print_help
    fi
}


function print_help () {
    cat <<- EOF

		${bold}NAME${normal}
		    ${bold}orchestra-admin${normal} - Orchetsra administration script

		${bold}OPTIONS${normal}
		    ${bold}install_requirements${normal}
		        Installs Orchestra requirements using apt-get and pip

		    ${bold}startproject${normal}
		        Creates a new Django-orchestra instance

		    ${bold}help${normal}
		        Displays this help text or related help page as argument
		        for example:
		            ${bold}orchestra-admin help startproject${normal}

		EOF
}


show () {
    echo " ${bold}\$ ${@}${normal}"
}
export -f show


run () {
    show "${@}"
    "${@}"
}
export -f run


check_root () {
    [ $(whoami) != 'root' ] && { echo -e "\nErr. This should be run as root\n" >&2; exit 1; }
}
export -f check_root


get_orchestra_dir () {
    if ! $(echo "import orchestra" | $PYTHON_BIN 2> /dev/null); then
        echo -e "\norchestra not installed.\n" >&2
        exit 1
    fi
    PATH=$(echo "import orchestra, os; print(os.path.dirname(os.path.realpath(orchestra.__file__)))" | $PYTHON_BIN)
    echo $PATH
}
export -f get_orchestra_dir


function print_install_requirements_help () {
    cat <<- EOF

		${bold}NAME${normal}
		    ${bold}orchetsra-admin install_requirements${normal} - Installs all Orchestra requirements using apt-get and pip

		${bold}OPTIONS${normal}
		    ${bold}-t, --testing${normal}
		        Install Orchestra normal requirements plus those needed for running functional tests

		    ${bold}-h, --help${normal}
		        Displays this help text

		EOF
}


function install_requirements () {
    opts=$(getopt -o h,t -l help,testing -- "$@") || exit 1
    set -- $opts
    testing=false

    while [ $# -gt 0 ]; do
        case $1 in
            -h|--help) print_deploy_help; exit 0 ;;
            -t|--testing) testing=true; shift ;;
            (--) shift; break;;
            (-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
            (*) break;;
        esac
        shift
    done
    unset OPTIND
    unset opt

    check_root || true
    ORCHESTRA_PATH=$(get_orchestra_dir) || true

    # Make sure locales are in place before installing postgres
    if [[ $({ perl --help > /dev/null; } 2>&1|grep 'locale failed') ]]; then
        run sed -i "s/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" /etc/locale.gen
        run locale-gen
        update-locale LANG=en_US.UTF-8
    fi

    # lxml: libxml2-dev, libxslt1-dev, zlib1g-dev
    APT="bind9utils \
         ca-certificates \
         gettext \
         libcrack2-dev \
         libxml2-dev \
         libxslt1-dev \
         python3 \
         python3-pip \
         python3-dev \
         ssh-client \
         wget \
         xvfb \
         zlib1g-dev"
    if $testing; then
        APT="${APT} \
            git \
            iceweasel \
            dnsutils"
    fi

    run apt-get update
    run apt-get install -y $APT

    # Install ca certificates before executing pip install
    if [[ ! -e  /usr/local/share/ca-certificates/cacert.org ]]; then
        mkdir -p /usr/local/share/ca-certificates/cacert.org
        wget -P /usr/local/share/ca-certificates/cacert.org \
            http://www.cacert.org/certs/root.crt \
            http://www.cacert.org/certs/class3.crt
        update-ca-certificates
    fi

    # cracklib and lxml are excluded on the requirements.txt because they need unconvinient system dependencies
    PIP="$(wget http://git.io/orchestra-requirements.txt -O - | tr '\n' ' ') \
        cracklib \
        lxml==3.3.5"
    if $testing; then
        PIP="${PIP} \
            selenium \
            xvfbwrapper \
            freezegun==0.3.14 \
            coverage \
            flake8 \
            django-debug-toolbar==1.3.0 \
            django-nose==1.4.4 \
            sqlparse \
            pyinotify \
            PyMySQL"
    fi

    run pip3 install $PIP

    # Install a more recent version of wkhtmltopdf (0.12.2) (PDF page number support)
    wkhtmltox_version=$(dpkg --list | grep wkhtmltox | awk {'print $3'})
    minor=$(echo -e "$wkhtmltox_version\n0.12.2.1" | sort -V | head -n 1)
    if [[ ! $wkhtmltox_version ]] || [[ $wkhtmltox_version != 0.12.2.1 && $minor == ${wkhtmltox_version} ]]; then
        wkhtmltox=$(mktemp)
        wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_amd64.deb -O ${wkhtmltox}
        dpkg -i ${wkhtmltox} || { echo "Installing missing dependencies for wkhtmltox..." && apt-get -f -y install; }
    fi
}
export -f install_requirements


print_startproject_help () {
    cat <<- EOF

		${bold}NAME${normal}
		    ${bold}orchestra-admin startproject${normal} - Create a new Django-Orchestra instance

		${bold}SYNOPSIS${normal}
		    Options: [ -h ]

		${bold}OPTIONS${normal}
		    ${bold}-h, --help${normal}
		            This help message

		${bold}EXAMPLES${normal}
		    orchestra-admin startproject controlpanel

		EOF
}


function startproject () {
    local PROJECT_NAME="$2"; shift

    opts=$(getopt -o h -l help -- "$@") || exit 1
    set -- $opts

    set -- $opts
    while [ $# -gt 0 ]; do
        case $1 in
            -h|--help) print_startproject_help; exit 0 ;;
            (--) shift; break;;
            (-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
            (*) break;;
        esac
        shift
    done

    unset OPTIND
    unset opt

    [ $(whoami) == 'root' ] && { echo -e "\nYou don't want to run this as root\n" >&2; exit 1; }
    ORCHESTRA_PATH=$(get_orchestra_dir) || { echo "Error getting orchestra dir"; exit 1; }
    if [[ ! -e $PROJECT_NAME/manage.py ]]; then
        run django-admin.py startproject $PROJECT_NAME --template="${ORCHESTRA_PATH}/conf/project_template"
        # This is a workaround for this issue https://github.com/pypa/pip/issues/317
        run chmod +x $PROJECT_NAME/manage.py
        # End of workaround ###
    else
        echo "Not cloning: $PROJECT_NAME already exists."
    fi
    # Install bash autocompletition for django commands
    if [[ ! $(grep 'source $HOME/.django_bash_completion.sh' ~/.bashrc &> /dev/null) ]]; then
        # run wget https://raw.github.com/django/django/master/extras/django_bash_completion \
        #    --no-check-certificate -O ~/.django_bash_completion.sh
        cp ${ORCHESTRA_PATH}/bin/django_bash_completion.sh ~/.django_bash_completion.sh
        echo 'source $HOME/.django_bash_completion.sh' >> ~/.bashrc
    fi
}
export -f startproject


[ $# -lt 1 ] && { print_help; exit 1; }
$1 "${@}"