#!/bin/bash

# Make_AddressManager-AppImage.sh
#
# Debian-based Linux script to bundle AddressManager.app & its dependencies as a standalone AppImage
#
# Requires: GSApp2AppImage.sh

APP_NAME=AddressManager
APP_VERSION=0.5.0
APP_SOURCES_DOWNLOAD_DIR="https://download.savannah.gnu.org/releases/gap/"
APP_SOURCES_DIR_NAME="Addresses-${APP_VERSION}"
APP_SOURCES_ARCHIVE_NAME=${APP_SOURCES_DIR_NAME}.tar.gz
APP_SOURCES_DOWNLOAD_CMD="wget ${APP_SOURCES_DOWNLOAD_DIR}${APP_SOURCES_ARCHIVE_NAME} && tar -xzvf ${APP_SOURCES_ARCHIVE_NAME}"
SOURCES_BUILD_SUBDIRECTORY="" # For apps where the make command must be executed from a subdirectory
BUILT_APP_SUBDIRECTORY=$APP_NAME # AddressManager.app gets built in a subdirectory: AddressManager
SHOULD_MAKE_INSTALL_APP=true # AddressManager requires its Addresses & AddressView frameworks to be installed (apps that don't build frameworks, etc. can set this to false)

# Environment vars read by GSApp2AppImage.sh
export APPIMAGE_BUILD_NUMBER=1
#export GS_LIBRARY_DIRS_TO_INCLUDE="Bundles ColorPickers Fonts Frameworks Images KeyBindings Libraries PostScript"
#export GS_TOOLS_TO_INCLUDE="gdnc gpbs make_services"


GetUserApprovalOrExit() {
    while true; do
        read -p "$1 [y/n] " yn
        case $yn in
            [Yy]* ) break;;
            [Nn]* ) exit;;
            * ) echo "Please answer yes or no.";;
        esac
    done
}

set -e
HERE=`pwd`

# VERIFY GSAPP2APPIMAGE.SH SCRIPT EXISTS
GSAPP2APPIMAGE_SH=`dirname $0`/GSApp2AppImage.sh

if [ ! -f "$GSAPP2APPIMAGE_SH" ]; then
    echo -e "\nERROR: Missing required script, GSApp2AppImage.sh. (Should be in same directory as this script)."
    exit 1
fi

# VERIFY OR INSTALL NEEDED TOOLS (INCLUDING TOOLS NEEDED BY GSAPP2APPIMAGE.SH)
if [ -z `which convert` ]; then PKGS_TO_INSTALL="imagemagick" ; fi
if [ -z `which patchelf` ]; then PKGS_TO_INSTALL="$PKGS_TO_INSTALL patchelf" ; fi
if [ -z `which wget` ]; then PKGS_TO_INSTALL="$PKGS_TO_INSTALL wget" ; fi

if [ ! -z "$PKGS_TO_INSTALL" ]; then
    echo -e "\nMissing one or more needed tools."
    GetUserApprovalOrExit "OK TO INSTALL PACKAGES FROM DEBIAN REPOSITORY ($PKGS_TO_INSTALL)?"

    sudo apt-get update
    sudo apt-get install -y $PKGS_TO_INSTALL
fi

# VERIFY OR INSTALL GNUSTEP DEV ENVIRONMENT
if [ -z $GNUSTEP_CONFIG_FILE ] || [ ! -f $GNUSTEP_CONFIG_FILE ]; then
    GNUSTEP_CONFIG_FILE=`find {~/etc/GNUstep,/usr/local/etc/GNUstep,/etc/GNUstep} -name "GNUstep.conf" 2>/dev/null | head -n 1`
fi

if [ -z $GNUSTEP_CONFIG_FILE ] || [ ! -f $GNUSTEP_CONFIG_FILE ] || [ ! -f $(grep ^GNUSTEP_MAKEFILES= $GNUSTEP_CONFIG_FILE | sed -E 's/.*=(.*$)/\1/')/application.make ]; then
    echo -e "\nNo GNUstep development environment found."
    GetUserApprovalOrExit "OK TO INSTALL GNUSTEP DEV ENVIRONMENT FROM DEBIAN REPOSITORY (build-essential libgnustep-gui-dev gnustep-back)?"

    sudo apt-get install -y build-essential libgnustep-gui-dev gnustep-back

    GNUSTEP_CONFIG_FILE=`find {~/etc/GNUstep,/usr/local/etc/GNUstep,/etc/GNUstep} -name "GNUstep.conf" 2>/dev/null | head -n 1`

    if [ -z $GNUSTEP_CONFIG_FILE ] || [ ! -f $GNUSTEP_CONFIG_FILE ] || [ ! -f $(grep ^GNUSTEP_MAKEFILES= $GNUSTEP_CONFIG_FILE | sed -E 's/.*=(.*$)/\1/')/application.make ]; then
        echo -e "\nERROR: Unable to install GNUstep dev environment."
        exit 1
    fi
fi

# SET UP GNUSTEP ENVIRONMENT PATHS
GNUSTEP_MAKEFILES_DIR=`grep ^GNUSTEP_MAKEFILES= $GNUSTEP_CONFIG_FILE | sed -E 's/.*=(.*$)/\1/'`
. $GNUSTEP_MAKEFILES_DIR/GNUstep.sh

# GET APP SOURCES
eval $APP_SOURCES_DOWNLOAD_CMD

# MAKE APP
cd "${APP_SOURCES_DIR_NAME}/${SOURCES_BUILD_SUBDIRECTORY}"
make -j`nproc`

if [ "$SHOULD_MAKE_INSTALL_APP" = true ]; then
    sudo GNUSTEP_MAKEFILES=$GNUSTEP_MAKEFILES make install
fi

APP_BUNDLE="`pwd`/${BUILT_APP_SUBDIRECTORY}/${APP_NAME}.app"

# GSAPP2APPIMAGE
cd "$HERE"
"$GSAPP2APPIMAGE_SH" "$APP_BUNDLE"

