#!/usr/bin/bash

die() {
  echo "$1"
  exit 1
}

if [ "$#" -lt "6" ]; then
  echo
  echo "Usage: mkdexe -N <app_name> -P <app_path> -E <app_exe>" \
    "[<extra_options>]"
  echo
  echo "extra_options are:"
  echo "  -C <app_category>  category (by default \"Game\")"
  echo "  -R <dosemurc_file> use custom config file"
  echo "  -r                 same as -R, but takes ~/.dosemu/dosemurc"
  echo "  -e <emu_name>      use another emulator (eg. dosbox)"
  echo
  echo "Example:"
  echo "./mkdexe -N Wolf3d -P ~/dos/games/wolf -E wolf3d.exe"
  echo "  In this example dosemurc is not specified, which means default config."
  exit 0
fi

optstring="N:C:P:E:R:rfx:ke:a:"

# set defaults
CATEGORY=Game
APP_PREF=org.dosemu2
DOSEMURC=dosemurc
EMU=dosemu

while getopts ${optstring} opt; do
  case ${opt} in
    N)
      APP_NAME=${OPTARG}
      ;;
    C)
      CATEGORY=${OPTARG}
      ;;
    P)
      APP_PATH=${OPTARG}
      ;;
    E)
      APP_EXE=${OPTARG}
      ;;
    R)
      RC=${OPTARG}
      ;;
    r)
      RC="$HOME/.dosemu/$DOSEMURC"
      ;;
    e)
      EMU=${OPTARG}
      ;;
    f)
      REFRESH=1
      ;;
    x)
      AI_ARGS="$AI_ARGS ${OPTARG}"
      ;;
    a)
      AppDir=${OPTARG}/AppDir
      ;;
    k)
      KEEP=1
      ;;
    ?)
      exit 1
      ;;
  esac
done
[ -n "$APP_NAME" ] || die "app name missing, use -N"
[ -n "$APP_PATH" ] || die "app path missing, use -P"
[ -n "$APP_EXE" ] || die "app exe name missing, use -E"
[ -r "$APP_PATH/$APP_EXE" ] || die "$APP_PATH/$APP_EXE does not exist"
[ -z "$RC" -o -r "$RC" ] || die "$RC missing"
dir=`dirname ${0}`
name=`basename ${0}`
prefix=${dir%bin}
if [ -z "${AppDir}" ]; then
  AppDir=$dir/AppDir
  [ -d "${AppDir}" ] || AppDir=
fi
if [ -z "${AppDir}" ]; then
  AppDir=$prefix/share/$name/AppDir
  [ -d "${AppDir}" ] || AppDir=
fi
[ -n "${AppDir}" ] || die "AppDir not found"
[ -d "${AppDir}" ] || die "${AppDir} not found"
APP_DIR=`basename $APP_PATH`
APPNAME=${APP_PREF}.${APP_NAME}
NEWENV=0
[ -z "$RC" ] || NEWENV=1

subst_vars() {
  sed -E \
    -e "s/@APP_DIR[@]/$APP_DIR/g" \
    -e "s/@APP_EXE[@]/$APP_EXE/g" \
    -e "s/@APP_NAME[@]/$APP_NAME/g" \
    -e "s/@ARCH[@]/$ARCH/g" \
    -e "s/@APPNAME[@]/$APPNAME/g" \
    -e "s/@CATEGORY[@]/$CATEGORY/g" \
    -e "s/@NEWENV[@]/$NEWENV/g" \
    -e "s/@EMU[@]/$EMU/g" \
    $1 >$2
}

FLIST=`find ${AppDir} -mindepth 1 -name '*.tmpl' -prune -o -print`
[ -n "$FLIST" ] || die "${AppDir} not found"

ARCH=`uname -m`
RUNDIR="$XDG_RUNTIME_DIR/mkdexe"
APPT="appimagetool-${ARCH}.AppImage"
APPTOOL="$RUNDIR/$APPT"
URL="https://github.com/AppImage/appimagetool/releases/download/continuous/$APPT"
[ -d "$RUNDIR" ] || mkdir "$RUNDIR"
[ -z "$REFRESH" ] || rm -f $APPTOOL
[ -f "$APPTOOL" ] || wget -O "$APPTOOL" $URL || die "appimagetool download failed"
[ -x "$APPTOOL" ] || chmod +x "$APPTOOL"
TMPD=`mktemp -d /tmp/mkdexe.XXXXXX`
[ -n "$TMPD" ] || die "failed to create tmp dir"
AD="$TMPD/AppDir"
mkdir "$AD"
[ -d "$AD" ] || die "failed to create AppDir"
echo "Created $AD"
cp $FLIST "$AD"
subst_vars ${AppDir}/AppRun.env.tmpl "$AD/AppRun.env"
subst_vars ${AppDir}/desktop.tmpl "$AD/${APPNAME}.desktop"
[ -z "$RC" ] || cp $RC $AD/$DOSEMURC
# copy game
cp -r "$APP_PATH" "$AD"

# now run appimagetool
export ARCH
$APPTOOL $AI_ARGS "$AD"
if [ -z "$KEEP" ]; then
  rm -rf "$TMPD"
else
  echo "tmp dir is $TMPD"
fi
