#!/bin/bash
#set -ueo pipefail
#set -x

REPO_DIR=$(cd $(dirname $0) && pwd)
SRC_DIR=${REPO_DIR}/src

ROOT_UID=0
DEST_DIR=

# Destination directory
if [ "$UID" -eq "$ROOT_UID" ]; then
  DEST_DIR="/usr/share/themes"
else
  DEST_DIR="$HOME/.themes"
fi

THEME_NAME=Sierra
FLAT_VARIANTS=('' '-compact')
COLOR_VARIANTS=('-light' '-dark')
OPACITY_VARIANTS=('' '-solid')
ALT_VARIANTS=('' '-alt')

usage() {
  printf "%s\n" "Usage: $0 [OPTIONS...]"
  printf "\n%s\n" "OPTIONS:"
  printf "  %-25s%s\n" "-d,  --dest DIR" "Specify theme destination directory (Default: ${DEST_DIR})"
  printf "  %-25s%s\n" "-n,  --name NAME" "Specify theme name (Default: ${THEME_NAME})"
  printf "  %-25s%s\n" "-o,  --opacity VARIANTS" "Specify theme opacity variant(s) [standard|solid] (Default: All variants)"
  printf "  %-25s%s\n" "-c,  --color VARIANTS" "Specify theme color variant(s) [light|dark] (Default: All variants)"
  printf "  %-25s%s\n" "-a,  --alt VARIANTS" "Specify theme titilebutton variant(s) [standard|alt] (Default: All variants)"
  printf "  %-25s%s\n" "-f,  --flat VARIANT" "Specify theme flat compact variant [standard|compact] (Default: All variants)"
  printf "  %-25s%s\n" "-na, --noapple VARIANT" "Specify gnome-shell to not display apple logo (Default: Display apple logo)"
  printf "  %-25s%s\n" "-g,  --gdm" "Install GDM theme"
  printf "  %-25s%s\n" "-h,  --help" "Show this help"
}

install() {
  local dest=${1}
  local name=${2}
  local flat=${3}
  local color=${4}
  local opacity=${5}
  local alt=${6}
  local noapple=${7}

  [[ ${color} == '-light' ]] && local ELSE_LIGHT=${color}
  [[ ${color} == '-dark' ]] && local ELSE_DARK=${color}

  local THEME_DIR=${dest}/${name}${flat}${color}${opacity}${alt}

  [[ -d ${THEME_DIR} ]] && rm -rf ${THEME_DIR}

  echo "Installing '${THEME_DIR}'..."

  mkdir -p                                                                              ${THEME_DIR}
  cp -ur ${REPO_DIR}/COPYING                                                            ${THEME_DIR}

  # Install index.theme
  echo "[Desktop Entry]" >>                                                             ${THEME_DIR}/index.theme
  echo "Type=X-GNOME-Metatheme" >>                                                      ${THEME_DIR}/index.theme
  echo "Name=${name}${flat}${color}${opacity}${alt}" >>                                 ${THEME_DIR}/index.theme
  echo "Comment=An Stylish Gtk+ theme based on Elegant Design" >>                       ${THEME_DIR}/index.theme
  echo "Encoding=UTF-8" >>                                                              ${THEME_DIR}/index.theme
  echo "" >>                                                                            ${THEME_DIR}/index.theme
  echo "[X-GNOME-Metatheme]" >>                                                         ${THEME_DIR}/index.theme
  echo "GtkTheme=${name}${flat}${color}${opacity}${alt}" >>                             ${THEME_DIR}/index.theme
  echo "MetacityTheme=${name}${flat}${color}${opacity}${alt}" >>                        ${THEME_DIR}/index.theme
  echo "IconTheme=Adwaita" >>                                                           ${THEME_DIR}/index.theme
  echo "CursorTheme=Adwaita" >>                                                         ${THEME_DIR}/index.theme
  echo "ButtonLayout=close,minimize,maximize:menu" >>                                   ${THEME_DIR}/index.theme
  # Install index.theme

  mkdir -p                                                                              ${THEME_DIR}/gnome-shell
  cp -ur ${SRC_DIR}/gnome-shell/{extensions,message-indicator-symbolic.svg,pad-osd.css} ${THEME_DIR}/gnome-shell
  cp -ur ${SRC_DIR}/gnome-shell/gnome-shell${color}${opacity}.css                       ${THEME_DIR}/gnome-shell/gnome-shell.css
  cp -ur ${SRC_DIR}/gnome-shell/common-assets                                           ${THEME_DIR}/gnome-shell/assets
  cp -ur ${SRC_DIR}/gnome-shell/assets${ELSE_DARK}/*.svg                                ${THEME_DIR}/gnome-shell/assets

  if [ "${noapple}" = true ] ; then
    cp -r ${SRC_DIR}/gnome-shell/assets${ELSE_DARK}/no-apple/*.svg                     ${THEME_DIR}/gnome-shell/assets
  fi
  
  cd ${THEME_DIR}/gnome-shell
  ln -s assets/no-events.svg no-events.svg
  ln -s assets/process-working.svg process-working.svg
  ln -s assets/no-notifications.svg no-notifications.svg

  mkdir -p                                                                              ${THEME_DIR}/gtk-2.0
  cp -ur ${SRC_DIR}/gtk-2.0/gtkrc${color}                                               ${THEME_DIR}/gtk-2.0/gtkrc
  cp -ur ${SRC_DIR}/gtk-2.0/assets${color}                                              ${THEME_DIR}/gtk-2.0/assets
  cp -ur ${SRC_DIR}/gtk-2.0/common/*.rc                                                 ${THEME_DIR}/gtk-2.0
  cp -ur ${SRC_DIR}/gtk-2.0/menubar-toolbar${color}.rc                                  ${THEME_DIR}/gtk-2.0/menubar-toolbar.rc

  mkdir -p                                                                              ${THEME_DIR}/gtk-3.0
  cp -ur ${SRC_DIR}/gtk-3.0/assets                                                      ${THEME_DIR}/gtk-3.0
  cp -ur ${SRC_DIR}/gtk-3.0/thumbnail${flat}${color}.png                                ${THEME_DIR}/gtk-3.0/thumbnail.png
  cp -ur ${SRC_DIR}/gtk-3.0/gtk${flat}${color}${opacity}${alt}.css                      ${THEME_DIR}/gtk-3.0/gtk.css
  [[ ${color} != '-dark' ]] && \
  cp -ur ${SRC_DIR}/gtk-3.0/gtk${flat}-dark${opacity}${alt}.css                         ${THEME_DIR}/gtk-3.0/gtk-dark.css

  mkdir -p                                                                              ${THEME_DIR}/metacity-1
  cp -ur ${SRC_DIR}/metacity-1/metacity-theme${color}.xml                               ${THEME_DIR}/metacity-1/metacity-theme-1.xml
  cp -ur ${SRC_DIR}/metacity-1/metacity-theme-2.xml                                     ${THEME_DIR}/metacity-1
  cp -ur ${SRC_DIR}/metacity-1/metacity-theme-3.xml                                     ${THEME_DIR}/metacity-1
  cp -ur ${SRC_DIR}/metacity-1/assets/*.png                                             ${THEME_DIR}/metacity-1

  mkdir -p                                                                              ${THEME_DIR}/unity
  cp -ur ${SRC_DIR}/unity                                                               ${THEME_DIR}

  mkdir -p                                                                              ${THEME_DIR}/xfwm4
  cp -ur ${SRC_DIR}/xfwm4/assets${color}/*.png                                          ${THEME_DIR}/xfwm4
  cp -ur ${SRC_DIR}/xfwm4/themerc${color}                                               ${THEME_DIR}/xfwm4/themerc

  mkdir -p                                                                              ${THEME_DIR}/cinnamon
  cp -ur ${SRC_DIR}/cinnamon/cinnamon${color}.css                                       ${THEME_DIR}/cinnamon/cinnamon.css
  cp -ur ${SRC_DIR}/cinnamon/common-assets                                              ${THEME_DIR}/cinnamon/assets
  cp -ur ${SRC_DIR}/cinnamon/assets${color}/*.svg                                       ${THEME_DIR}/cinnamon/assets
  cp -ur ${SRC_DIR}/cinnamon/thumbnail${color}.png                                      ${THEME_DIR}/cinnamon/thumbnail.png

  mkdir -p                                                                              ${THEME_DIR}/plank
  cp -ur ${SRC_DIR}/plank/${name}${color}/*.theme                                       ${THEME_DIR}/plank
}

install_gdm() {
    local THEME_DIR=${1}/${2}${3}${4}${5}${6}
      # bakup and install files related to gdm theme
      if [[ ! -f /usr/share/gnome-shell/gnome-shell-theme.gresource.bak ]]; then
          mv -f /usr/share/gnome-shell/gnome-shell-theme.gresource \
                /usr/share/gnome-shell/gnome-shell-theme.gresource.bak
      fi
      if [[ -f /usr/share/gnome-shell/theme/ubuntu.css ]]; then
          if [[ ! -f /usr/share/gnome-shell/theme/ubuntu.css.bak ]]; then
              mv -f /usr/share/gnome-shell/theme/ubuntu.css \
                     /usr/share/gnome-shell/theme/ubuntu.css.bak
          fi
          cp -af ${THEME_DIR}/gnome-shell/gnome-shell.css \
                 /usr/share/gnome-shell/theme/ubuntu.css
      fi
      glib-compile-resources \
       --sourcedir=${THEME_DIR}/gnome-shell \
       --target=/usr/share/gnome-shell/gnome-shell-theme.gresource \
       ${SRC_DIR}/gnome-shell/gnome-shell-theme.gresource.xml
  echo "Installing 'gnome-shell-theme.gresource'..."
}

while [[ $# -gt 0 ]]; do
  case "${1}" in
    -d|--dest)
      dest="${2}"
      if [[ ! -d "${dest}" ]]; then
        echo "ERROR: Destination directory does not exist."
        exit 1
      fi
      shift 2
      ;;
    -n|--name)
      name="${2}"
      shift 2
      ;;
    -g|--gdm)
      gdm='true'
      shift 1
      ;;
    -na|--no-apple)
      noapple=true
      shift 1
      ;;
    -o|--opacity)
      shift
      for opacity in "${@}"; do
        case "${opacity}" in
          standard)
            opacitys+=("${OPACITY_VARIANTS[0]}")
            shift
            ;;
          solid)
            opacitys+=("${OPACITY_VARIANTS[1]}")
            shift
            ;;
          -*|--*)
            break
            ;;
          *)
            echo "ERROR: Unrecognized opacity variant '$1'."
            echo "Try '$0 --help' for more information."
            exit 1
            ;;
        esac
      done
      ;;
    -c|--color)
      shift
      for color in "${@}"; do
        case "${color}" in
          light)
            colors+=("${COLOR_VARIANTS[0]}")
            shift
            ;;
          dark)
            colors+=("${COLOR_VARIANTS[1]}")
            shift
            ;;
          -*|--*)
            break
            ;;
          *)
            echo "ERROR: Unrecognized color variant '$1'."
            echo "Try '$0 --help' for more information."
            exit 1
            ;;
        esac
      done
      ;;
    -f|--flat)
      shift
      for flat in "${@}"; do
        case "${flat}" in
          standard)
            flats+=("${FLAT_VARIANTS[0]}")
            shift
            ;;
          compact)
            flats+=("${FLAT_VARIANTS[1]}")
            shift
            ;;
          -*|--*)
            break
            ;;
          *)
            echo "ERROR: Unrecognized color variant '$1'."
            echo "Try '$0 --help' for more information."
            exit 1
            ;;
        esac
      done
      ;;
    -a|--alt)
      shift
      for alt in "${@}"; do
        case "${alt}" in
          standard)
            alts+=("${ALT_VARIANTS[0]}")
            shift
            ;;
          alt)
            alts+=("${ALT_VARIANTS[1]}")
            shift
            ;;
          -*|--*)
            break
            ;;
          *)
            echo "ERROR: Unrecognized alt variant '$1'."
            echo "Try '$0 --help' for more information."
            exit 1
            ;;
        esac
      done
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "ERROR: Unrecognized installation option '$1'."
      echo "Try '$0 --help' for more information."
      exit 1
      ;;
  esac
done

for flat in "${flats[@]:-${FLAT_VARIANTS[@]}}"; do
  for opacity in "${opacitys[@]:-${OPACITY_VARIANTS[@]}}"; do
    for color in "${colors[@]:-${COLOR_VARIANTS[@]}}"; do
      for alt in "${alts[@]:-${ALT_VARIANTS[@]}}"; do
        install "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${flat}" "${color}" "${opacity}" "${alt}" ${noapple}
      done
    done
  done
done

if [[ "${gdm:-}" == 'true' ]]; then
  install_gdm "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${flat}" "${color}" "${opacity}" "${alt}"
fi

echo
echo Done.
