#!/usr/bin/env bash

function configure_build_env() {
  echo "Configuring build environment..."
  
  echo "Installing Elementary core SDK packages..."
  sudo apt install build-essential desktop-file-utils gettext gobject-introspection libgee-0.8-dev \
  libgirepository1.0-dev libglib2.0-dev libgtk-3-dev libunity-dev libxml2-dev libxml2-utils meson  \
  valac valadoc git cmake libunity-dev libwnck-3-dev || exit 2
  
  echo "Downloading libgranite 5.3.2..."
  mkdir granite
  cd granite
  wget 'https://bintray.com/sudo-give-me-coffee/granite/download_file?file_path=amd64.tar.gz' -O granite.tgz || exit 2
  echo "Instaling least ModeSwitch supported libgranite..."
  tar -zxvf granite.tgz || exit 2
  rm granite.tgz
  sudo dpkg -i ./* || exit 2
  
  echo "Cleaning elementary4all dir..."
  cd ..
  rm -rfv ./granite
  echo "Done :)"
}


if [ -z "$1" ] ;then
  echo "No package supplied"
  exit 1
fi

if [ "$1" == "--configure" ] ;then
  configure_build_env
  exit 0
fi

################################################
#                                              #
#  Checks if is in run only mode               #
#                                              #
################################################

if [ "$1" == "--run" ] ;then
  if [ -z "$2" ] ;then
    echo "No package supplied"
    exit 1
  fi
  echo -e "\nEntering test mode...\n"
  package_name="$2"
  app_name=$(echo "$package_name" | sed 's/\./ /g' | awk '{print $4}')
  cd "$package_name/$app_name.AppDir"
  ./AppRun || exit 2
  exit 0
fi

################################################
#                                              #
#  "Translate" the app name                    #
#                                              #
################################################
 
package_name="$1"
app_name=$(echo "$package_name" | sed 's/\./ /g' | awk '{print $4}')
git_url=$(echo "$package_name" | sed 's/\./ /g' | awk '{print "https://"$2"."$1"/"$3"/"$4".git"}')

################################################
#                                              #
#  Create the app build structure              #
#                                              #
################################################

mkdir $package_name 2> /dev/null
cd $package_name

################################################
#                                              #
#  Download app source code                    #
#                                              #
################################################

if [ ! -d ".git" ]; then
  git clone $git_url . || exit 2
fi

APP_USR_DIR="$(pwd)/$app_name.AppDir/usr"
mkdir -p "$APP_USR_DIR/share/glib-2.0/schemas" 2> /dev/null
mkdir build 2> /dev/null

################################################
#                                              #
#  Extract GLib Schema                         #
#                                              #
################################################

cp data/$package_name.gschema.xml $app_name.AppDir/usr/share/glib-2.0/schemas/ 2> /dev/null
glib-compile-schemas $app_name.AppDir/usr/share/glib-2.0/schemas/ 2> /dev/null

################################################
#                                              #
#  Check if App use meson build system         #
#                                              #
################################################

if [ -f "meson.build" ] ; then                                    #
  sed -i "s/ '\/etc/ 'etc/g" data/meson.build                     #  We don't want files on / to avoid
  meson build --prefix="$APP_USR_DIR"                                  #  permission errors
  cd build                                                        #
  ninja install
fi

################################################
#                                              #
#   Check if App use cmake build system        #
#                                              #
################################################

if [ -f "CMakeLists.txt" ] ; then                                 #
  sed -i "s/ \/etc/ $app_name.AppDir\/etc/g" data/CMakeLists.txt  #  We don't want files on / to avoid
  cd build                                                        #  permission errors
  cmake .. -DCMAKE_INSTALL_PREFIX:PATH="$APP_USR_DIR"                  #
  make 
  make install --ignore-errors --keep-going
fi

cd ..

################################################
#                                              #
#   Create the AppRun file                     #
#                                              #
################################################

cat > "$app_name.AppDir/AppRun" <<\EOF
#!/bin/sh
HERE="$(dirname "$(readlink -f "${0}")")"
export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/:"${PATH}"
export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/i386-linux-gnu/:"${HERE}"/usr/lib/x86_64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/:"${LD_LIBRARY_PATH}"
export PYTHONPATH="${HERE}"/usr/share/pyshared/:"${PYTHONPATH}"
export PYTHONHOME="${HERE}"/usr/
export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}"
export PERLLIB="${HERE}"/usr/share/perl5/:"${HERE}"/usr/lib/perl5/:"${PERLLIB}"
export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/:"${GSETTINGS_SCHEMA_DIR}"
export QT_PLUGIN_PATH="${HERE}"/usr/lib/qt4/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib32/qt4/plugins/:"${HERE}"/usr/lib64/qt4/plugins/:"${HERE}"/usr/lib/qt5/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib32/qt5/plugins/:"${HERE}"/usr/lib64/qt5/plugins/:"${QT_PLUGIN_PATH}"
EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2- | sed -e 's|%.||g')
exec ${EXEC} "$@"
EOF

chmod +x "$app_name.AppDir/AppRun"

################################################
#                                              #
#   Some apps create files on /etc but the     #
#   build system can't put automatically on    #
#   root of AppDir                             #
#                                              #
################################################

mv "$APP_USR_DIR/etc" "$(pwd)/$app_name.AppDir" 2> /dev/null

################################################
#                                              #
#   Extract .desktop file to root of AppDir    #
#                                              #
################################################

cp "$APP_USR_DIR/share/applications/$package_name.desktop" "$app_name.AppDir/"
