#!/bin/bash

# This line is only changed for debugging purposes
recursiveEx="edubuntu-installer"

_autoRemovePkgFn () {
  # shellcheck disable=SC2124
  _meta=$@
  _pkg=$(apt-cache depends "${_meta}" | grep ":" | cut -d ":" -f 2 | cut -c 2-)
  # shellcheck disable=SC2206
  _pkgArry=(${_pkg})
  # shellcheck disable=SC2068
  for i in ${!_pkgArry[@]}; do
    if [ "${_pkgArry[i]}" = "386" ]; then
      unset '_pkgArry[i]'
    fi
  done
  # shellcheck disable=SC2068
  for _mark in ${_pkgArry[@]}; do
    apt-mark auto "${_mark}" || true
  done

  apt-get autoremove "${_meta}" -y
}

# shellcheck disable=SC2124
args=$@
if ! [ "${args}" = "" ]; then
   if [ "$1" = "newdefault" ]; then
     rm /usr/share/glib-2.0/schemas/96-edubuntu-*.gschema.override
     echo "$2" > "$3"
     glib-compile-schemas /usr/share/glib-2.0/schemas/
     exit 0
   elif [ "$1" = "tertdefault" ]; then
    rm /usr/share/glib-2.0/schemas/96-edubuntu-*.gschema.override
    glib-compile-schemas /usr/share/glib-2.0/schemas/
    exit 0
   fi
   # shellcheck disable=SC2206
   argArry=($args)
   for i in "${!argArry[@]}"; do
     _autoRemovePkgFn "${argArry[i]}";
   done
   exit 0
fi

# Before we begin, let's make sure the cache is updated
qapt-batch --update

while true; do

(
  echo 10; sleep 1
  echo 20; sleep 1
  echo 30; sleep 1
  echo 40; sleep 1
  echo 50; sleep 1
  echo 60; sleep 1
  echo 70; sleep 1
  echo 80; sleep 1
  echo 90; sleep 1
  echo 100; sleep 1
) | zenity --progress \
  --title="Please Wait" \
  --width=600 \
  --text="Building Package Table..." \
  --percentage=0 \
  --auto-close \
  --no-cancel &

# List or packages to potentially install
declare -a pkgListArry=(
[0]="ubuntu-edu-preschool"
[1]="ubuntu-edu-primary"
[2]="ubuntu-edu-secondary"
[3]="ubuntu-edu-tertiary"
[4]="ubuntu-edu-music"
[5]="ubuntu-edu-teaching"
[6]="edubuntu-fonts"
#[5]="edubuntu-menu"
)

pkgTable=()
# shellcheck disable=SC2068
for pkg in ${pkgListArry[@]}; do
  if dpkg -s "${pkg}" &> /dev/null; then
    pkgInst="TRUE"
  else
    pkgInst="FALSE"
  fi
  pkgTable+=("${pkgInst}")
  pkgTable+=("${pkg}")
  pkgDesc=$(apt-cache search "${pkg}" | head -n 1 | sed -e "s/${pkg} - //g")
  pkgTable+=("${pkgDesc}")
done

if [ "${DESKTOP_SESSION}" = "ubuntu" ]; then
  pkgTable+=("FALSE")
  pkgTable+=("Change_Default_Setup")
  pkgTable+=("Change to a setup for a different age group")
fi

selectedPkg=$(zenity --width=600 --height=600 \
  --title="Edubuntu Installer" \
  --window-icon=/usr/share/icons/hicolor/scalable/apps/edubuntu-installer.svg \
  --list \
  --multiple \
  --checklist \
  --separator=" " \
  --text="Select or de-select metapackage(s) to modify installation status." \
  --ok-label="Modify Installed Package Selection" \
  --cancel-label="Close" \
  --column "Installed" \
  --column "Metapackage" \
  --column "Description" \
  "${pkgTable[@]}");
selExit=$? 

if [ -z "${selectedPkg}" ]; then
 if [ "${selExit}" = "1" ]; then exit 0; fi
fi

# shellcheck disable=SC2206
selectedArry=($selectedPkg)

chngDefaultFn() { 
  preschConf="/usr/share/glib-2.0/schemas/96-edubuntu-preschool.gschema.override"
  primarConf="/usr/share/glib-2.0/schemas/96-edubuntu-primary.gschema.override"
  secondConf="/usr/share/glib-2.0/schemas/96-edubuntu-secondary.gschema.override"
  
  defTable=()
  #defTable=([0]="=========")
  if [ -e "${preschConf}" ]; then
    defTable+=("TRUE")
  else
    defTable+=("FALSE")
  fi
  defTable+=("Preschool")
  if [ -e "${primarConf}" ]; then
    defTable+=("TRUE")
  else
    defTable+=("FALSE")
  fi
  defTable+=("Primary/Elementary")
  if [ -e "${secondConf}" ]; then
    defTable+=("TRUE")
  else
    defTable+=("FALSE")
  fi
  defTable+=("Secondary/Middle/High_School")
  if [ -e "${preschConf}" ] || [ -e "${primarConf}" ] || [ -e "${secondConf}" ]; then
    defTable+=("FALSE")
  else
    defTable+=("TRUE")
  fi
  defTable+=("Tertiary/College/University_(Default)")

  while true; do
  newDefault=$(zenity --width=600 --height=300 \
    --title="Edubuntu Installer" \
    --window-icon=/usr/share/icons/hicolor/scalable/apps/edubuntu-installer.svg \
    --list \
    --radiolist \
    --separator=" " \
    --text="Select the new default setup" \
    --ok-label="Continue" \
    --cancel-label="Skip/Go Back" \
    --column="Select" \
    --column="Mode" \
    "${defTable[@]}" );
  selExit=$?
  
  if [ "${newDefault}" = "" ] || [ "${selExit}" = "1" ]; then
    return
  fi

  preschConfStr=$(cat <<EOF
[org.gnome.desktop.background:ubuntu]
picture-uri = 'file:///usr/share/backgrounds/edubuntu_default-preschool.png'
picture-uri-dark = 'file:///usr/share/backgrounds/edubuntu_default-preschool.png'

[org.gnome.desktop.screensaver:ubuntu]
picture-uri = 'file:///usr/share/backgrounds/edubuntu_default-preschool.png'

[org.gnome.shell:ubuntu]
favorite-apps = [ 'firefox_firefox.desktop', 'org.kde.gcompris.desktop', 'tuxpaint.desktop', 'org.kde.klettres.desktop', 'org.gnome.Calculator.desktop', 'yelp.desktop' ]
EOF
)

  primarConfStr=$(cat <<EOF
[org.gnome.desktop.background:ubuntu]
picture-uri = 'file:///usr/share/backgrounds/edubuntu_default-primary.png'
picture-uri-dark = 'file:///usr/share/backgrounds/edubuntu_default-primary.png'

[org.gnome.desktop.screensaver:ubuntu]
picture-uri = 'file:///usr/share/backgrounds/edubuntu_default-primary.png'

[org.gnome.shell:ubuntu]
favorite-apps = [ 'firefox_firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Nautilus.desktop', 'tuxmath.desktop', 'org.kde.ktouch.desktop', 'org.gnome.Calculator.desktop', 'artha.desktop', 'libreoffice-writer.desktop', 'yelp.desktop' ]
EOF
)

  secondConfStr=$(cat <<EOF
[org.gnome.desktop.background:ubuntu]
picture-uri = 'file:///usr/share/backgrounds/edubuntu_default-secondary.png'
picture-uri-dark = 'file:///usr/share/backgrounds/edubuntu_default-secondary.png'

[org.gnome.desktop.screensaver:ubuntu]
picture-uri = 'file:///usr/share/backgrounds/edubuntu_default-secondary.png'

[org.gnome.shell:ubuntu]
favorite-apps = [ 'firefox_firefox.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Calculator.desktop', 'org.gnome.Gnote.desktop', 'libreoffice-writer.desktop', 'yelp.desktop' ]
EOF
)

  if [ "${newDefault}" = "Preschool" ]; then
    pkexec "${recursiveEx}" newdefault "${preschConfStr}" "${preschConf}"
    return
  elif [ "${newDefault}" = "Primary/Elementary" ]; then
    pkexec "${recursiveEx}" newdefault "${primarConfStr}" "${primarConf}"
    return
  elif [ "${newDefault}" = "Secondary/Middle/High_School" ]; then
    pkexec "${recursiveEx}" newdefault "${secondConfStr}" "${secondConf}"
    return
  elif [ "${newDefault}" = "Tertiary/College/University_(Default)" ]; then
    pkexec "${recursiveEx}" tertdefault
    return
  fi
  done
}

echo "${selectedArry[@]}"

# shellcheck disable=SC2068
for pkg in ${selectedArry[@]}; do
  if [ "${pkg}" = "Change_Default_Setup" ]; then
    chngDefaultFn
  fi
done

for i in "${!selectedArry[@]}"; do
  # shellcheck disable=SC2053
  if [[ ${selectedArry[i]} = "Change_Default_Setup" ]]; then
    unset 'selectedArry[i]'
  fi
done

selPkgNotinst=()
# shellcheck disable=SC2068
for pkg in ${selectedArry[@]}; do
  if dpkg -s "${pkg}" &> /dev/null; then
    true
  else
    selPkgNotinst+=("${pkg}")
  fi
done


instSelPkgFn () {
  if [ -x /usr/bin/qapt-batch ]; then
    qapt-batch --install --qwindowtitle "Edubuntu Installer" "${selPkgNotinst[@]}"
  fi
}

instSelPkgConfFn () {
    # shellcheck disable=SC2128
    warnStr=$(cat <<EOF
The following packages will be installed by this action:

${selPkgNotinst[@]}

Do you wish to continue?
EOF
)
  zenity \
  --title "Edubuntu Installer" \
  --window-icon=/usr/share/icons/hicolor/scalable/apps/edubuntu-installer.svg \
  --width "600" \
  --height "400" \
  --question \
  --text "${warnStr}" \
  --ok-label "Continue" \
  --cancel-label "Skip/Go Back"
}

if [ -n "${selPkgNotinst[0]}" ]; then
  if instSelPkgConfFn; then
    instSelPkgFn
  fi
fi

# shellcheck disable=SC2206
unselArry=(${pkgListArry[@]})
# shellcheck disable=SC2068
for sel in ${selectedArry[@]}; do
  for i in "${!unselArry[@]}"; do
    # shellcheck disable=SC2053
    if [[ ${unselArry[i]} = $sel ]]; then
      unset 'unselArry[i]'
    fi
  done
done

unSelPkginst=()
# shellcheck disable=SC2068
for pkg in ${unselArry[@]}; do
  if dpkg -s "${pkg}" &> /dev/null; then
    unSelPkginst+=("${pkg}")
  fi
done

removeConfirmFn () {
  warnStr=$(cat <<EOF
The following packages may be removed by this action:

${uninstDepRecInl[@]}

If you do not wish to have any one of these individual packages removed,
simply reinstall them. No settings are being removed by uninstallation.
Additionally, some of these packages may be required by other packages and
may not be uninstalled, so parts of this list may not apply to you.

If you are uninstalling more than one metapackage, you will be asked for your
password more than once.
EOF
)
  zenity \
  --title "Edubuntu Installer" \
  --window-icon=/usr/share/icons/hicolor/scalable/apps/edubuntu-installer.svg \
  --width "600" \
  --height "400" \
  --question \
  --text "${warnStr}" \
  --ok-label "Continue" \
  --cancel-label "Skip/Go Back"
}


if [ -n "${unSelPkginst[0]}" ]; then
  _uninstDepRec=$(apt-cache depends "${unSelPkginst[0]}" | grep ":" | cut -d ":" -f 2 | cut -c 2-)
  # shellcheck disable=SC2206
  uninstDepRecArry=(${_uninstDepRec})
  for i in "${!uninstDepRecArry[@]}"; do
    if [ "${uninstDepRecArry[i]}" = "386" ]; then
      unset 'uninstDepRecArry[i]'
    fi
  done
  # shellcheck disable=SC2068
  uninstDepRecInl=$(echo ${uninstDepRecArry[@]} | fmt -w 80)
  if removeConfirmFn; then
    # shellcheck disable=2068
    pkexec "${recursiveEx}" ${unSelPkginst[@]} | \
      zenity --progress --auto-close --no-cancel --pulsate
  fi
fi

done
