#!/bin/bash

# Installation prefix
PREFIX=$HOME/local/canola
# Where to store the output of configure, etc.
OUTPUT=/tmp/setup_canola
# Where the source code is being kept
SRCDIR=$PWD/src/

# EFL SVN repo
EFL_SVN="http://svn.enlightenment.org/svn/e/trunk/"
# EFL SVN revision
EFL_SVN_REV="39824"
# EFL packages to be compiled
EFL_PACKAGES="eina eet embryo evas ecore edje etk epsilon e_dbus"
# Specific Python Bindings to be compiled
EFL_BINDINGS="evas ecore edje e_dbus epsilon etk efl_utils"

GIT_PROFUSION="git://git.profusion.mobi/"
GIT_OPENBOSSA="git://code.openbossa.org/"

MISC_DEPS_PY="python-dispatcher python-lightmediascanner"
MISC_DEPS_C="lightmediascanner"
CANOLA_PKG="canola"
CANOLA_DEPS_PY="canola-daemon atabake python-terra python-downloadmanager"
CANOLA_DEPS_C="canola-thumbnailer"

UBUNTU_DEPENDENCIES="git-core subversion build-essential python-pyrex cython python-setuptools automake libtool zlib1g-dev libjpeg62-dev gettext cvs xorg-dev libpng12-dev libdbus-1-dev libsqlite3-dev libogg-dev libflac-dev libmp4v2-dev libvorbis-dev python-feedparser liblua5.1-0 liblua5.1-0-dev"

MAKEOPTIONS="-j3"

BLACK='\E[30;40m'
RED='\E[31;40m'
GREEN='\E[32;40m'
YELLOW='\E[33;40m'
BLUE='\E[34;40m'
MAGENTA='\E[35;40m'
CYAN='\E[36;40m'
WHITE='\E[37;40m'
# Colour-enabled echo
# $1 -> message to be printed
# $2 -> colour escape sequence to be used
cecho() {
    echo -ne "$2"
    echo "$1"
    tput sgr0
}  

print_begin() {
    echo -n "BUILDING $1 : "
}

print_success() {
    cecho "DONE" $GREEN
}

print_fail() {
    cecho "FAIL" $RED
}

die() {
    print_fail
    echo "ERROR: $@"
    exit 1
}

checkout_code() {
    for i in $EFL_PACKAGES ; do
        echo -n "DOWNLOADING $i : "
        if [ -d $i ] ; then
            echo "already there (erase it if you wish to re-download)"
        else
	    if [ $i = "etk" -o $i = "epsilon" ] ; then
		URL="OLD/$i"
            else
                URL="$i"
            fi
            svn checkout --revision $EFL_SVN_REV ${EFL_SVN}$URL &> /dev/null || die "Failed fetching source for $i"
            print_success
        fi
    done

    for i in $EFL_BINDINGS ; do
        echo -n "DOWNLOADING python-$i : "
        if [ -d python-$i ] ; then
            echo "already there (erase it if you wish to re-download)"
        else
            if [ $i = "etk" -o $i = "epsilon" ] ; then
                URL="OLD/BINDINGS/python/python-$i"
            else
                URL="BINDINGS/python/python-$i"
            fi
            svn checkout --revision $EFL_SVN_REV ${EFL_SVN}$URL &> /dev/null || die "Failed fetching source for python-$i"
            print_success
        fi
    done

    for i in $MISC_DEPS_PY $MISC_DEPS_C ; do
        echo -n "DOWNLOADING $i : "
        if [ -d $i ] ; then
            echo "already there (erase it if you wish to re-download)"
        else
            git clone $GIT_PROFUSION$i.git &> /dev/null || die "Failed fetching source for $i"
            print_success
        fi
    done

    for i in $CANOLA_PKG $CANOLA_DEPS_PY $CANOLA_DEPS_C; do
        echo -n "DOWNLOADING $i : "
        if [ -d $i ] ; then
            echo "already there (erase it if you wish to re-download)"
        else
            git clone $GIT_OPENBOSSA$i/mainline.git $i &> /dev/null || die "Failed fetching source for $i"
            print_success
        fi
    done
}

build() {
    PACKAGE=$1
    print_begin $PACKAGE
    pushd $PACKAGE > /dev/null
    mkdir -p $OUTPUT/$PACKAGE
    if [ -f Makefile ] ; then
        make distclean &> /dev/null
    fi
    CFLAGS="-g -O0" ./autogen.sh --prefix=$PREFIX &> $OUTPUT/$PACKAGE/output-autogen.log || die "Failed configuring $i"
    make $MAKEOPTIONS  &> $OUTPUT/$PACKAGE/output-make.log || die "Failed building $i"
    make install &> $OUTPUT/$PACKAGE/output-install.log || die "Failed installing $i"
    make clean &> /dev/null
    print_success
    popd > /dev/null
}

build_efl() {
    for i in $EFL_PACKAGES ; do 
        build $i
    done
}

build_bindings() {
    mkdir -p $PREFIX/lib/python2.6/site-packages
    for i in $EFL_BINDINGS ; do
        print_begin python-$i
        mkdir -p $OUTPUT/python-$i
        rm -rf python-$i/build
        cd python-$i || die "Unable to cd to python-$i"
        ./build.sh --force $PREFIX &> $OUTPUT/python-$i/output-build.log || die "Failed building python-$i"
        cd ..
        print_success
    done
}

build_canola() {
    for i in $MISC_DEPS_C $CANOLA_DEPS_C ; do
        build $i
    done

    for i in $MISC_DEPS_PY $CANOLA_DEPS_PY ; do
        print_begin $i
        mkdir -p $OUTPUT/$i
        cd $i
        python setup.py build &> $OUTPUT/$i/output-build.log || die "Failed building $i"
        python setup.py install --prefix=$PREFIX &> $OUTPUT/$i/output-install.log || die "Failed installing $i"
        cd ..
        print_success
    done
}

check_dependencies() {
    if [ -f /etc/debian_version ] ; then
        if ! dpkg -s $UBUNTU_DEPENDENCIES &> /dev/null ; then
            cat << EOF
We've detected that you're running a debian based distro and that
some of the required dependencies are not installed. In order to
install them, please run:

sudo aptitude install $UBUNTU_DEPENDENCIES

If you've already installed everything and believe this to be a 
simple mistake, please run setup_canola again with --no-check.
EOF
        exit
        fi
    fi
}

mkdir -p $SRCDIR
cd $SRCDIR

export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
export PATH=$PREFIX/bin:$PATH
export LD_LIBRARY_PATH=$PREFIX/lib/:$LD_LIBRARY_PATH
export PYTHONPATH=$PREFIX/lib/python2.6/site-packages/:$PYTHONPATH

if [ $# -eq 0 -o "x$1" != "x--no-check" ] ; then 
    check_dependencies
fi
checkout_code
build_efl
build_bindings
build_canola


