#!/bin/bash
DIRECTORY="$(readlink -f "$(dirname "$0")")"

function error {
  echo -e "\e[91m$1\e[39m"
  exit 1
}

#you can specify a preexisting app with variable 1
if [ ! -z "$1" ];then
  name="$1"
  step=2
  editing=yes
else
  name=''
  step=1
fi

#Sets the height of all dialog windows
windowheight=400

#start on this step:
#step=3
#start with this app name:
#name='Email Checker'

while true;do
  case $step in
    1)
      echo "Welcome to the Create App wizard!
With a few simple steps, your project can take advantage of Pi-Apps"\'" features and be displayed in the application list.
This wizard will save your work as you go." | yad --text-info --fontname=12 --wrap --show-uri \
        --image="${DIRECTORY}/icons/in-progress.png" --image-on-top \
        --title="Create App Wizard" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$((windowheight-100)) \
        --button=Cancel!"${DIRECTORY}/icons/exit.png":1 \
        --button=Next!"${DIRECTORY}/icons/forward.png":0 || exit 0
      step=$((step+1))
      ;;
    2)
      
      if [ ! -z "$name" ];then
        namelocked='yes'
        echo 'name field is already filled. Making it read-only.'
      fi
      
      if [ -f "${DIRECTORY}/apps/${name}/icon-64.png" ];then
        iconfield="--field=Icon::RO"
        iconpath="apps/${name}/icon-64.png"
      else
        iconfield="--field=Icon::FL"
        iconpath="${HOME}/bla"
      fi
      
      #if install script already exists, grey out compatibility line
      compatibilityentry="--field=Compatibility::CB"
      compatibilitypreset="64bit and 32bit!32bit only!64bit only"
      if [ ! -z "$name" ];then
      compatibilityentry="--field=Compatibility::RO"
        if [ -f "${DIRECTORY}/apps/${name}/install" ];then
          compatibilitypreset="64bit and 32bit"
        elif [ -f "${DIRECTORY}/apps/${name}/install-64" ] && [ -f "${DIRECTORY}/apps/${name}/install-32" ];then
          compatibilitypreset="64bit and 32bit"
        elif [ -f "${DIRECTORY}/apps/${name}/install-64" ];then
          compatibilitypreset="64bit only"
        elif [ -f "${DIRECTORY}/apps/${name}/install-32" ];then
          compatibilitypreset="32bit only"
        else
          compatibilityentry="--field=Compatibility::CB"
        fi
      fi
      
      output="$(yad --form \
        --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$((windowheight+200)) \
        --text="Step ${step}: enter some information. The name field is mandatory." \
        --field="Name of app:$([ ! -z "$namelocked" ]&&echo ':RO')"  "$name" \
        "$iconfield" "$iconpath" \
        --field="Website:" "$(cat "${DIRECTORY}/apps/${name}/website" 2>/dev/null || echo '')" \
        "$compatibilityentry" "$compatibilitypreset" \
        --field="Description:":TXT "$(cat "${DIRECTORY}/apps/${name}/description" || cat "${DIRECTORY}/apps/template/description")" \
        --field="Credits:":TXT "$(cat "${DIRECTORY}/apps/${name}/credits" || cat "${DIRECTORY}/apps/template/credits")" \
        $([ ! -z $editing ]&&echo "--button=Save!${DIRECTORY}/icons/save.png:4") \
        --button=Previous!"${DIRECTORY}/icons/back.png":2 \
        --button=Next!"${DIRECTORY}/icons/forward.png":0 \
        2>/dev/null)"
      button=$? #get exit code to determine which button was pressed
      
      echo "$button"
      echo "Output: ${output}EOO"
      output="$(echo "$output" | tr '|' '\n' )"
      
      # if ------ next -- or -------- save ----- was clicked
      if [ $button == 0 ] || [ $button == 4 ];then
        name="$(echo "$output" | sed -n '1p')"
        icon="$(echo "$output" | sed -n '2p')"
        website="$(echo "$output" | sed -n '3p')"
        compatibility="$(echo "$output" | sed -n '4p')"
        description="$(echo -e "$(echo "$output" | sed -n '5p')")"
        credits="$(echo -e "$(echo "$output" | sed -n '6p')")"
        
        #convert compatibility var into machine-readable
        if [ "$compatibility" == "64bit and 32bit" ];then
          compatibility='64 32'
        elif [ "$compatibility" == "32bit only" ];then
          compatibility='32'
        elif [ "$compatibility" == "64bit only" ];then
          compatibility='64'
        fi
        
        #name field must be populated
        if [ ! -z "$name" ];then
          #check if name is a duplicate
          if [ -z "$(ls "${DIRECTORY}/apps" | grep -x "$name")" ] || [ ! -z $namelocked ];then
            #create app folder
            mkdir -p "${DIRECTORY}/apps/${name}" || error "failed to create ${DIRECTORY}/apps/${name}!"
            namelocked='yes'
            
            #if website field is populated
            if [ ! -z "$website" ];then
              echo "$website" > "${DIRECTORY}/apps/${name}/website"
              echo "Created ${DIRECTORY}/apps/${name}/website"
            fi
            
            #if icon field is populated and if file exists
            if [ ! -z "$icon" ] && [ -f "$icon" ];then
              #ensure imagemagick is installed
              if [ ! -f /usr/bin/convert ];then
                yad --text="To resize the images, imagemagick must be installed.
Install now?" \
                --text-align=center --center --title='Quick question' --window-icon="${DIRECTORY}/icons/logo.png" \
                --button=No!"${DIRECTORY}/icons/exit.png":1 --button=Yes!"${DIRECTORY}/icons/check.png":0
                button=$?
                if [ $button == 0 ];then
                  sudo apt install -y --no-install-recommends imagemagick || icon=''
                else
                  #clear the icon var to disable the icon
                  icon=''
                fi
              fi
              #if icon var not empty
              if [ ! -z "$icon" ];then
                #scale it to 24x24
                convert "$icon" -resize 24x24 "${DIRECTORY}/apps/${name}/icon-24.png"
                if [ -f "${DIRECTORY}/apps/${name}/icon-24.png" ];then
                  echo "Created ${DIRECTORY}/apps/${name}/icon-24.png from $icon"
                else
                  echo "Failed to create ${DIRECTORY}/apps/${name}/icon-24.png from $icon! Most likely you need to install imagemagick."
                fi
                #scale it to 64x64
                convert "$icon" -resize 64x64 "${DIRECTORY}/apps/${name}/icon-64.png"
                if [ -f "${DIRECTORY}/apps/${name}/icon-64.png" ];then
                  echo "Created ${DIRECTORY}/apps/${name}/icon-64.png from $icon"
                else
                  echo "Failed to create ${DIRECTORY}/apps/${name}/icon-64.png from $icon! Most likely you need to install imagemagick."
                fi
              fi
            fi
            
            #if description field is populated
            if [ ! -z "$description" ];then
              echo "$description" > "${DIRECTORY}/apps/${name}/description"
              echo "Created ${DIRECTORY}/apps/${name}/description"
            fi
            
            #if credits field is populated
            if [ ! -z "$credits" ];then
              echo "$credits" > "${DIRECTORY}/apps/${name}/credits"
              echo "Created ${DIRECTORY}/apps/${name}/credits"
            elif [ -z "$credits" ] && [ -f "${DIRECTORY}/apps/${name}/credits" ] ;then
              #clear credits if the user wanted them cleared.
              echo '' > "${DIRECTORY}/apps/${name}/credits"
            fi
            
            step=$((step+1))
          else
            echo 'That app name already exists!'
            yad --title="Error" --window-icon="${DIRECTORY}/icons/logo.png" --center \
            --text="That app name already exists!
Do you want to edit ${name}?" --timeout=10 \
            --button="Edit ${name}!${DIRECTORY}/icons/edit.png":0 --button="Oops, go back!${DIRECTORY}/icons/back.png":1 || name=''
          fi
        else
          echo 'Name of app may not be left blank!'
          yad --title="Error" --window-icon="${DIRECTORY}/icons/logo.png" --center \
            --text="Name of app may not be left blank!" --timeout=10 \
            --button=OK:0
        fi
        
        #if Save was clicked then exit now
        if [ $button == 4 ];then
          exit 0
        fi
      elif [ $button == 2 ];then
        #previous - don't save changes
        step=$((step-1))
      else
        #like clicking the X or something 
        exit 0
      fi
      ;;
    3)
      #create install script
      if [ "$compatibility" == "64 32" ] && [ ! -f "${DIRECTORY}/apps/${name}/install-64" ] && [ ! -f "${DIRECTORY}/apps/${name}/install-32" ] && [ ! -f "${DIRECTORY}/apps/${name}/install" ];then
        #ask if two install scripts are necessary, of if both architectures can share 1 script
        echo "In the previous page, you said this app is compatible with 64bit and 32bit.
Do you want two install scripts, one for 32bit and the other for 64bit?
Or do you want one combined install script?" | yad --text-info --fontname=12 --wrap --show-uri \
          --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$windowheight \
          --button="Previous!${DIRECTORY}/icons/back.png":1 \
          --button='2 scripts':2 \
          --button='1 script':0
        
        button=$? #get exit code to determine which button was pressed
        
        if [ $button == 1 ];then
          step=$((step-1))
          continue
        fi
        
        if [ ! $button == 0 ] && [ ! $button == 2 ];then
          exit 0
        fi
        
        cp -rn "${DIRECTORY}/apps/template/." "${DIRECTORY}/apps/${name}"
        if [ $button == 0 ];then
          #button clicked: '1 script'
          true #do nothing as template has install script by default
          compatibility=6432 #change compatibility var to show that only an install script will be created
        elif [ $button == 2 ];then
          cp -n "${DIRECTORY}/apps/${name}/install" "${DIRECTORY}/apps/${name}/install-64"
          mv -n "${DIRECTORY}/apps/${name}/install" "${DIRECTORY}/apps/${name}/install-32"
        fi
      elif [ "$compatibility" == "32" ];then
        cp -rn "${DIRECTORY}/apps/template/." "${DIRECTORY}/apps/${name}"
        mv -n "${DIRECTORY}/apps/${name}/install" "${DIRECTORY}/apps/${name}/install-32"
      elif [ "$compatibility" == "64" ];then
        cp -rn "${DIRECTORY}/apps/template/." "${DIRECTORY}/apps/${name}"
        mv -n "${DIRECTORY}/apps/${name}/install" "${DIRECTORY}/apps/${name}/install-64"
      fi
      
      if [ ! -f "${DIRECTORY}/apps/${name}/install-64" ] && [ ! -f "${DIRECTORY}/apps/${name}/install-32" ] && [ ! -f "${DIRECTORY}/apps/${name}/install" ];then
        cp -rn "${DIRECTORY}/apps/template/." "${DIRECTORY}/apps/${name}"
      fi
      
      #find the best text editor
      preferrededitor="$(cat "${DIRECTORY}/data/settings/Preferred text editor")"
      if [ -z "$preferrededitor" ];then
        preferrededitor=geany
      fi
      
      #open the correct file
      if [ "$compatibility" == "32" ];then
        scriptname='install-32'
        "$preferrededitor" "${DIRECTORY}/apps/${name}/${scriptname}" &
      elif [ "$compatibility" == "64" ];then
        scriptname='install-64'
        "$preferrededitor" "${DIRECTORY}/apps/${name}/${scriptname}" &
      elif [ "$compatibility" == "64 32" ];then
        scriptname='' #this symbolizes that 2 scripts will be made
        "$preferrededitor" "${DIRECTORY}/apps/${name}/install-64" &
        "$preferrededitor" "${DIRECTORY}/apps/${name}/install-32" &
      elif [ "$compatibility" == "6432" ];then
        scriptname='install'
        "$preferrededitor" "${DIRECTORY}/apps/${name}/${scriptname}" &
      fi
      
      #install shellcheck if not installed
      [ ! -f /usr/bin/shellcheck ]&&sudo apt install -y shellcheck
      
      #if creating 2 scripts
      if [ -z "$scriptname" ];then
        #if creating 2 scripts
        output="$(yad --form --on-top \
          --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$windowheight \
          --text="Now it"\'"s time to make your install-32 and install-64 scripts.
One of these scripts will be executed when somebody clicks your app"\'"s Install button.
Two text editors should have openened and you can create your scripts." \
          --field="Run install-32 script":FBTN "${DIRECTORY}/etc/terminal-run "\""cd $HOME;$'${DIRECTORY}/apps/${name}/install-32';echo 'Closing in 10 seconds.';sleep 10"\"" "\""Running install-32 script of $name"\""" \
          --field="Shellcheck install-32"!!'Having problems? This utility helps you locate syntax errors.':FBTN "${DIRECTORY}/etc/terminal-run "\""shellcheck $'${DIRECTORY}/apps/${name}/install-32';echo 'Press Enter to exit.';read enter"\"" "\""Shellcheck"\""" \
          --field="Run install-64 script":FBTN "${DIRECTORY}/etc/terminal-run "\""cd $HOME;$'${DIRECTORY}/apps/${name}/install-64';echo 'Closing in 10 seconds.';sleep 10"\"" "\""Running install-64 script of $name"\""" \
          --field="Shellcheck install-64"!!'Having problems? This utility helps you locate syntax errors.':FBTN "${DIRECTORY}/etc/terminal-run "\""shellcheck $'${DIRECTORY}/apps/${name}/install-64';echo 'Press Enter to exit.';read enter"\"" "\""Shellcheck"\""" \
          --button=Previous!"${DIRECTORY}/icons/back.png":2 \
          --button=Next!"${DIRECTORY}/icons/forward.png":0 \
          2>/dev/null)"
        button=$? #get exit code to determine which button was pressed
      else
        #if creating 1 script
        output="$(yad --form --on-top \
          --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$windowheight \
          --text="Now it"\'"s time to make your ${scriptname} script. This will be executed anytime somebody clicks the Install button.
A text editor should have openened and you can create your install script." \
          --field="Run script":FBTN "${DIRECTORY}/etc/terminal-run "\""cd $HOME;$'${DIRECTORY}/apps/${name}/${scriptname}';echo 'Closing in 10 seconds.';sleep 10"\"" "\""Running ${scriptname} script of $name"\""" \
          --field="Shellcheck"!!'Having problems? This utility helps you locate syntax errors.':FBTN "${DIRECTORY}/etc/terminal-run "\""shellcheck $'${DIRECTORY}/apps/${name}/${scriptname}';echo 'Press Enter to exit.';read enter"\"" "\""Shellcheck"\""" \
          --button=Previous!"${DIRECTORY}/icons/back.png":2 \
          --button=Next!"${DIRECTORY}/icons/forward.png":0 \
          2>/dev/null)"
        button=$? #get exit code to determine which button was pressed
      fi
      
      if [ $button == 0 ];then
        #next - save changes
        step=$((step+1))
      elif [ $button == 2 ];then
        #previous - save changes
        step=$((step-1))
      else
        #like clicking the X or something 
        exit 0
      fi
      ;;
    4)
      
      #find the best text editor
      preferrededitor="$(cat "${DIRECTORY}/data/settings/Preferred text editor")"
      if [ -z "$preferrededitor" ];then
        preferrededitor=geany
      fi
      
      "$preferrededitor" "${DIRECTORY}/apps/${name}/uninstall" &
      
      #install shellcheck if not installed
      [ ! -f /usr/bin/shellcheck ]&&sudo apt install -y shellcheck
      
      output="$(yad --form --on-top \
        --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$windowheight \
        --text='Now it'\''s time to make your uninstall script. This will be executed anytime somebody clicks the Uninstall button.
A text editor should have openened... Never mind, you know what to do.' \
        --field="Run script":FBTN "${DIRECTORY}/etc/terminal-run "\""cd $HOME;$'${DIRECTORY}/apps/${name}/uninstall';echo 'Closing in 10 seconds.';sleep 10"\"" "\""Running uninstall script of $name"\""" \
        --field="Shellcheck"!!'Having problems? This utility helps you locate syntax errors.':FBTN "${DIRECTORY}/etc/terminal-run "\""shellcheck $'${DIRECTORY}/apps/${name}/uninstall';echo 'Press Enter to exit.';read enter"\"" "\""Shellcheck"\""" \
        --button=Previous!"${DIRECTORY}/icons/back.png":2 \
        --button=Next!"${DIRECTORY}/icons/forward.png":0 \
        2>/dev/null)"
      button=$? #get exit code to determine which button was pressed
      
      if [ $button == 0 ];then
        step=$((step+1))
      elif [ $button == 2 ];then
        step=$((step-1))
      else
        #like clicking the X or something 
        exit 0
      fi
      ;;
    5)
      LIST="${DIRECTORY}/icons/uninstalled.png
${DIRECTORY}/apps/${name}/icon-24.png
$name
"\("uninstalled"\)" $(echo "$(cat "${DIRECTORY}/apps/${name}/description" || echo "Description unavailable")" | head -n1)"
      
      echo -e "$LIST" | yad --list \
        --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$windowheight \
        --text='Make sure everything looks right.
Here'\''s what it will look like in the app list:' \
        --column=:IMG --column=:IMG --column=Name --column=tip:HD --tooltip-column=4 --no-headers \
        --button=Previous!"${DIRECTORY}/icons/back.png":2 \
        --button=Next!"${DIRECTORY}/icons/forward.png":0 \
        2>/dev/null
      button=$? #get exit code to determine which button was pressed
      
      if [ $button == 0 ];then
        step=$((step+1))
      elif [ $button == 2 ];then
        step=$((step-1))
      else
        #like clicking the X or something 
        exit 0
      fi
      ;;
    6)
           
      text="$(echo "$(cat "${DIRECTORY}/apps/${name}/description" || echo "Description unavailable")" | head -n1)
Current status: uninstalled
Website: $(cat "${DIRECTORY}/apps/${name}/website" || echo "unavailable")
$(echo "$(cat "${DIRECTORY}/apps/${name}/description" || echo "Description unavailable")" | grep -v "$(echo "$(cat "${DIRECTORY}/apps/${name}/description" || echo "Description unavailable")" | head -n1)")"
      
      echo "$text" | yad --text-info --fontname=12 --wrap --show-uri \
        --title="Create App: Step $step" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=700 --height=400 \
        --text='Make sure everything looks right.
Here'\''s a preview of the Details window:' \
        --image="${DIRECTORY}/apps/${name}/icon-64.png" --image-on-top \
        --button=Previous!"${DIRECTORY}/icons/back.png":2 \
        --button=Next!"${DIRECTORY}/icons/forward.png":0 \
        2>/dev/null
      button=$? #get exit code to determine which button was pressed
      
      if [ $button == 0 ];then
        step=$((step+1))
      elif [ $button == 2 ];then
        step=$((step-1))
      else
        #like clicking the X or something 
        exit 0
      fi
      ;;
    7)
      echo "Done!
You app is located at ${DIRECTORY}/apps/${name}
To add your app to the Pi-Apps official repository, put that folder in a .ZIP file and open an issue for Botspot (the developer of Pi-Apps): https://github.com/Botspot/pi-apps/issues/new" | yad --text-info --fontname=12 --wrap --show-uri \
        --image="${DIRECTORY}/icons/in-progress.png" --image-on-top \
        --title="Create App Wizard" --window-icon="${DIRECTORY}/icons/logo.png" --center --width=310 --height=$windowheight \
        --button=Previous!"${DIRECTORY}/icons/back.png":0 \
        --button=Close!"${DIRECTORY}/icons/exit.png":1 || exit 0
      step=$((step-1))
      ;;
    *)
      error "Unknown step ${step}!"
      ;;
  esac
done