#!/bin/bash
#############################################################################
# Require la siguiente estructura de carpetas:
#
# - packages
#   - custom (carpeta con los paquetes adicionales a incluir en la portable)
#   - exclude (fichero con los codigos de paquetes a excluir)
# - standard
#   - gvSIG-desktop*.online.zip
#   - gvSIG-desktop*-lin-x86.gvspkg
#   - gvSIG-desktop*-lin-x86_64.gvspkg
#   - gvSIG-desktop*-win-x86.gvspkg
# - patchs 
#   - patchs.sh (se ejecuta antes que los scripts de ant y zipear la instalacion)
# - make-portable
#
# Y se ejecutara el archivo "make-portable" desde ese directorio.
#
# Al final se crean las carpetas y archivos:
#
# - target/gvsig-desktop-VERSION-lin-x86
# - target/gvsig-desktop-VERSION-lin-x86_64
# - target/gvsig-desktop-VERSION-win-x86
#
# - target/gvsig-desktop-VERSION-lin-x86.zip
# - target/gvsig-desktop-VERSION-lin-x86_64.zip
# - target/gvsig-desktop-VERSION-win-x86.zip
#
##############################################################################

#set -x

#function handle_error() {
#    echo "FAILED: line $1, exit code $2"
#    exit 1
#}
#
#trap 'handle_error $LINENO $?' ERR 

set -e

cd "$(dirname $0)"
SCRIPT_NAME=$(basename $0)

export BASEFOLDER="$PWD"
export TARGET="$BASEFOLDER/target"
export PATCHSFOLDER=$BASEFOLDER/patchs

function logger_info() {
    echo $*
}

function logger_warn() {
    echo $*
}

function get_package_info() {
    PACKAGE_PATH="$1"
    PACKAGE_NAME="$(basename $PACKAGE_PATH)"
    PACKAGE_CODE=$(expr "$PACKAGE_NAME" : "gvSIG-desktop-[0-9.]*-\\([a-zA-Z0-9._]*\\)-")
    set +e
    PACKAGE_VERSION=$(expr "$PACKAGE_NAME" : "gvSIG-desktop-[0-9.]*-[a-zA-Z0-9._]*-\\([0-9.]*-[0-9]*\\)-")
    set -e
    if [ "X${PACKAGE_VERSION}X" == "XX" ] ; then
        PACKAGE_VERSION=$(expr "$PACKAGE_NAME" : "gvSIG-desktop-[0-9._]*-[a-zA-Z0-9._]*-\\([0-9.]*-[A-Z][.A-Za-z0-9_]*-[0-9]*\\)-")
    fi
}

function install_symbols() {
    INSTALL_FOLDER="$1"
    get_package_info $2

    cd "$INSTALL_FOLDER"
    mkdir -p "home/gvSIG/plugins/org.gvsig.app.mainplugin/Symbols"
    cd "home/gvSIG/plugins/org.gvsig.app.mainplugin/Symbols"
    rm -rf "$PACKAGE_CODE"
    if include_package $PACKAGE_CODE ; then
        logger_info "Install symbols $PACKAGE_CODE $PACKAGE_VERSION"
        unzip -qq "$PACKAGE_PATH" 2>&1 | sed "/warning:  stripped absolute path/d"
    else
        logger_info "Exclude symbols $PACKAGE_CODE"
        cp "$PACKAGE_PATH" "$INSTALL_FOLDER/install"
    fi
}

function install_jCRS_EPSG() {
    INSTALL_FOLDER="$1"
    get_package_info $2

    cd "$INSTALL_FOLDER"
    mkdir -p "gvSIG/extensiones/org.gvsig.projection.app.jcrs/db/EPSG"
    cd "gvSIG/extensiones/org.gvsig.projection.app.jcrs/db/EPSG"
    rm -rf "$PACKAGE_CODE"
    if include_package $PACKAGE_CODE ; then
        logger_info "Install jCRS EPSG data base $PACKAGE_CODE $PACKAGE_VERSION"
        unzip -qq "$PACKAGE_PATH" 2>&1 | sed "/warning:  stripped absolute path/d"
    else
        logger_info "Exclude jCRS EPSG data base $PACKAGE_CODE"
        cp "$PACKAGE_PATH" "$INSTALL_FOLDER/install"
    fi
}

function install_plugin() {
    INSTALL_FOLDER="$1"
    get_package_info $2

    cd "$INSTALL_FOLDER/gvSIG/extensiones"
    rm -rf "$PACKAGE_CODE"
    if include_package $PACKAGE_CODE ; then
        logger_info "Install plugin $PACKAGE_CODE $PACKAGE_VERSION"
        unzip -qq "$PACKAGE_PATH" 2>&1 | sed "/warning:  stripped absolute path/d"
    else
        logger_info "Exclude plugin $PACKAGE_CODE"
        cp "$PACKAGE_PATH" "$INSTALL_FOLDER/install"
    fi
}

function install_translations() {
    INSTALL_FOLDER="$1"
    get_package_info $2

    cd "$INSTALL_FOLDER/i18n"
    rm -rf "$PACKAGE_CODE"
    if include_package $PACKAGE_CODE ; then
        logger_info "Install translations $PACKAGE_CODE $PACKAGE_VERSION"
        unzip -qq "$PACKAGE_PATH" 2>&1 | sed "/warning:  stripped absolute path/d"
    else
        logger_info "Exclude translations $PACKAGE_CODE"
        cp "$PACKAGE_PATH" "$INSTALL_FOLDER/install"
    fi
}

function run_plugins_install_scripts() {
    INSTALL_FOLDER="$1"
    
    logger_info ""
    logger_info "Running plugins install scripts"
    cd "$INSTALL_FOLDER/gvSIG/extensiones"
    for PLUGIN_CODE in *
    do
        if [ -f "$INSTALL_FOLDER/gvSIG/extensiones/$PLUGIN_CODE/install/install.xml" ] ; then
            logger_info "Running custom install script of $PLUGIN_CODE"
            cd $INSTALL_FOLDER
            ant -Dgvsig_dir="$INSTALL_FOLDER" -Dextensions_dir="$INSTALL_FOLDER/gvSIG/extensiones" -f "$INSTALL_FOLDER/gvSIG/extensiones/$PLUGIN_CODE/install/install.xml"
        fi
    done
}

function install_packages() {
    INSTALL_FOLDER="$1"
    PACKAGES_FOLDER="$2"
    
    logger_info ""
    logger_info "Processing $(basename $PACKAGES_FOLDER) packages"
    for PACKAGE_PATH in $PACKAGES_FOLDER/*.gvspkg
    do
      if [ -f "$PACKAGE_PATH" ] ; then
        PACKAGE_NAME="$(basename $PACKAGE_PATH)"
        if expr "$PACKAGE_NAME" : "gvSIG-desktop-[0-9.]*-translations[.]" >/dev/null ; then
          install_translations "$INSTALL_FOLDER" "$PACKAGE_PATH"
        elif expr "$PACKAGE_NAME" : "gvSIG-desktop-[0-9.]*-symbols[.]"  >/dev/null ; then
          install_symbols "$INSTALL_FOLDER" "$PACKAGE_PATH"
        elif expr "$PACKAGE_NAME" : "gvSIG-desktop-[0-9.]*-EPSG_"  >/dev/null ; then
          install_jCRS_EPSG "$INSTALL_FOLDER" "$PACKAGE_PATH"
        else
          install_plugin "$INSTALL_FOLDER" "$PACKAGE_PATH"
        fi
      fi
    done
}

function include_package() {
    set +e
    egrep  "^$1\$" "$BASEFOLDER/packages/excludes" >/dev/null
    FOUND=$?
    set -e
    if [ "$FOUND" == 1 ] ; then
        return 0
    fi
    return 1
}


function remove_excluded_packages() {
    logger_info "Checking plugins to remove"
    cd "$INSTALL_FOLDER/gvSIG/extensiones"
    while read line; do
        if [ -d "$line" ] ; then 
            logger_info "Removing plugin $line"
            rm -rf "$line"
        fi
    done < "$BASEFOLDER/packages/excludes"
}

function install_portable_configuration_linux_files() {
    logger_info "Install portable configuration file (gvSIG.config)"
    cp "$INSTALL_FOLDER/tools/gvSIG.config" "$INSTALL_FOLDER"
    chmod a+x "$INSTALL_FOLDER/gvSIG.sh"
}


function remove_unneed_files_for_linux() {
    logger_info "Removing nom-${PORTABLE_OSNAME} files"
    rm -rf "$INSTALL_FOLDER/busybox.exe"
    rm -f $INSTALL_FOLDER/gvsig-desktop-devel.*
    rm -f $INSTALL_FOLDER/gvsig-desktop.*
    rm -f $INSTALL_FOLDER/gvsig-package-installer.*
    rm -f $INSTALL_FOLDER/*.cmd
    rm -f $INSTALL_FOLDER/check.sh
    rm -rf "$INSTALL_FOLDER/gvSIG/extensiones/jre_7_windows_i586"
    rm -rf $INSTALL_FOLDER/tools/*.cmd
    rm -rf $INSTALL_FOLDER/tools/*.exe
    rm -rf $INSTALL_FOLDER/tools/gvsig-desktop-portable.xml
    rm -rf $INSTALL_FOLDER/tools/make-portable.sh
}

function install_portable_configuration_windows_files() {
    logger_info "Install portable configuration file"
    cp "$INSTALL_FOLDER/tools/gvsig-desktop-portable.exe" "$INSTALL_FOLDER/gvsig-desktop.exe"
    cp "$INSTALL_FOLDER/tools/gvsig-desktop-portable.xml" "$INSTALL_FOLDER/gvsig-desktop.xml"
    rm -rf "$INSTALL_FOLDER/busybox.exe"
    cp "$INSTALL_FOLDER/tools/busybox.exe" "$INSTALL_FOLDER"
}

function remove_unneed_files_for_windows() {
    logger_info "Removing nom-${PORTABLE_OSNAME} files"
    rm -f $INSTALL_FOLDER/gvsig-desktop-devel.*
    rm -f $INSTALL_FOLDER/gvsig-desktop.cmd
    rm -f $INSTALL_FOLDER/gvSIG.sh
    rm -rf $INSTALL_FOLDER/tools
    rm -f $INSTALL_FOLDER/gvsig-package-installer.*
}

function mkdist() {
    cd $BASEFOLDER/standard

    export PORTABLE_OS="$1"
    export PORTABLE_OSNAME="$2"
    export PORTABLE_PLATFORM="$3"
    export PORTABLE_VERSION=$(expr *.zip : "gvSIG-desktop-\\([0-9.]*-[0-9]*\\)")
    export PORTABLE_STATUS=$(expr *.zip : "gvSIG-desktop-[0-9.]*-[0-9]*-\\([a-zA-Z]*[0-9]*\)")
    export PORTABLE_NAME="gvsig-desktop-$PORTABLE_VERSION-${PORTABLE_STATUS}-${PORTABLE_OS}-${PORTABLE_PLATFORM}"
    
    export INSTALL_FOLDER="$TARGET/$PORTABLE_NAME"

    logger_info "Removing previous files"
    rm -rf "$TARGET/gvsig-desktop"
    rm -rf "$INSTALL_FOLDER"
    rm -f  "$TARGET/${PORTABLE_NAME}.zip"
    rm -rf "$TARGET/packages-${PORTABLE_OS}-${PORTABLE_PLATFORM}"
    
    logger_info "Uncompressing ${PORTABLE_OSNAME} base files"
    cd $TARGET
    unzip -qq "$BASEFOLDER/standard/gvSIG-desktop-$PORTABLE_VERSION-$PORTABLE_STATUS-all-x86-online.zip"
    mv gvsig-desktop $PORTABLE_NAME

    logger_info "Uncompressing ${PORTABLE_OSNAME}-${PORTABLE_PLATFORM} package set"
    mkdir -p "$TARGET/packages-${PORTABLE_OS}-${PORTABLE_PLATFORM}"
    cd "$TARGET/packages-${PORTABLE_OS}-${PORTABLE_PLATFORM}"
    unzip -qq "$BASEFOLDER/standard/gvSIG-desktop-${PORTABLE_VERSION}-${PORTABLE_STATUS}-${PORTABLE_OS}-${PORTABLE_PLATFORM}.gvspks"
    
    install_packages "$INSTALL_FOLDER" "$TARGET/packages-${PORTABLE_OS}-${PORTABLE_PLATFORM}"

    install_packages "$INSTALL_FOLDER" "$BASEFOLDER/packages/custom"

    case $PORTABLE_OS in 
    lin)
        install_portable_configuration_linux_files
        remove_unneed_files_for_linux
        ;;
    win)
        install_portable_configuration_windows_files
        remove_unneed_files_for_windows
        ;;
    esac

    remove_excluded_packages
    
    if [ -f $PATCHSFOLDER/patchs.sh ] ; then
        chmod a+x $PATCHSFOLDER/patchs.sh
        logger_info "Appling patch to the instalation."
        source $PATCHSFOLDER/patchs.sh
    fi
    
    run_plugins_install_scripts $INSTALL_FOLDER
    
    logger_info "Compresing ${PORTABLE_OSNAME}-${PORTABLE_PLATFORM} portable (this take a moment)"
    cd "$TARGET"
    echo zip -qyr9 "${PORTABLE_NAME}.zip" "${PORTABLE_NAME}"
    echo "
    
    WARNING: instalar comando zip
    
    "
    
    logger_info "Removing temporary package folder"
    rm -rf $TARGET/packages-${PORTABLE_OS}-${PORTABLE_PLATFORM}
    
    logger_info "${PORTABLE_OSNAME}-${PORTABLE_PLATFORM} portable created."
}


function main() {
    mkdist lin linux x86
    mkdist lin linux x86_64    
    mkdist win windows x86
    echo "Creation ended"
}

mkdir -p "$TARGET"
main | tee "$TARGET/${SCRIPT_NAME}.log"

