#!/bin/bash

mainTempDir='/tmp/gdm-tools'         # Temprary Directory for 'gdm-tools'
tmpDir="$mainTempDir/gnomeconf2gdm"  # Temprary Directory for this script
conf='99-gnomeconf2gdm'              # Name for the GDM configuration file
confDir='/etc/dconf/db/gdm.d'        # Directory for GDM configuration file
profileDir='/etc/dconf/profile'      # Directory for GDM DConf profile
# Contents of GDM DConf profile
profileData='user-db:user
system-db:gdm
file-db:/usr/share/gdm/greeter-dconf-defaults'

help() {
  echo 'gdm-tools: gnomeconf2gdm
A script that gets Settings from Gnome Desktop and applies them to GDM
Usage: gnomeconf2gdm [options]
Options:
  {no options}		Apply Settings to GDM
  -r,reset 		Reset GDM settings to default
  -h,help,--help	Print this help message'
}

printHeader() {
  local schema="$1"
  local name="$2"
  local lenSchema="$(echo -n "$schema" | wc -m)"
  local lenName="$(echo -n "$name" | wc -m)"
  local lenDiff=$((lenSchema - lenName))
  local lenDiffHalf=$((lenDiff / 2))
  echo -n '#'
  local i
  for ((i=$((1-(lenDiff%2)));i<lenDiffHalf;i++)); do
    echo -n '-'
  done
  echo -n " $name "
  for ((i=0;i<lenDiffHalf;i++)); do
    echo -n '-'
  done
  echo
  echo "[$schema]"
  echo -n "#"
  for ((i=0;i<=lenSchema;i++)); do
    echo -n "-"
  done
  echo
}
printValues() {
  local name="$1"
  local rawSchema=$2
  local schema=$(echo $rawSchema | tr / .)
  local keys="$3"
  printHeader "$rawSchema" "$name"
  for key in $keys; do
    echo -n "$key="
    gsettings get $schema $key
  done
  echo
}

getValues(){
  printValues 'Interface' 'org/gnome/desktop/interface'\
              'cursor-theme
               cursor-size
               icon-theme
               show-battery-percentage
               clock-show-seconds
               clock-show-weekday
               clock-format
               font-name
               font-antialiasing
               font-hinting
               text-scaling-factor'

  printValues 'Sound' 'org/gnome/desktop/sound'\
              'theme-name
               event-sounds
               input-feedback-sounds
               allow-volume-above-100-percent'

#  printValues 'Login Screen' 'org/gnome/login-screen'\
#              'logo
#               disable-user-list
#               disable-restart-buttons
#               banner-message-enable
#               banner-message-text'

  printValues 'Mouse' 'org/gnome/desktop/peripherals/mouse'\
              'speed
               natural-scroll
               accel-profile'

  printValues 'Touchpad' 'org/gnome/desktop/peripherals/touchpad'\
              'speed
               tap-to-click
               natural-scroll
               two-finger-scrolling-enabled
               disable-while-typing'

  printValues 'Night Light' 'org/gnome/settings-daemon/plugins/color'\
              'night-light-enabled
               night-light-temperature
               night-light-schedule-automatic
               night-light-schedule-from
               night-light-schedule-to'
}

nonRootWork() {
  mkdir -p $tmpDir
  getValues > ${tmpDir}/${conf}
}

rootWork(){
  sudo mkdir -p $profileDir $confDir
  echo "$profileData" | sudo tee ${profileDir}/gdm > /dev/null
  sudo mv -T ${tmpDir}/${conf} ${confDir}/${conf}
  sudo dconf update
}

cleanTemp(){
  rm -rf "$tmpDir"/
  rmdir "$mainTempDir" &> /dev/null
}

reset(){
  if [ -f "${confDir}/${conf}" ]; then
    sudo rm ${confDir}/${conf}
    sudo dconf update
    echo "Settings restored"
  else
    echo "Already restored"
  fi
}

main(){
  if [ "$UID" != 0 ]; then
    case "$1" in
    '')
      nonRootWork
      rootWork
      cleanTemp
      echo Successful!
    ;;
    reset | -r )
      reset
    ;;
    help | --help | -h )
      help
    ;;
    *)
      echo "Please type 'gnomeconf2gdm -h' for help" > /dev/stderr
      status=2
    ;;
    esac
  else
    echo 'Please run as a non-root user' > /dev/stderr
    status=1
  fi
}

status=0
main "$@"
exit $status
