#!/bin/bash

function print_red() {
  printf "$(tput setaf 1)$1$(tput sgr0)"
}

function print_green() {
  printf "$(tput setaf 2)$1$(tput sgr0)"
}

function print_blue() {
  printf "$(tput setaf 4)$1$(tput sgr0)"
}

function status() {
  crd_status=$(/opt/google/chrome-remote-desktop/chrome-remote-desktop --get-status)
  print_blue "CRD status: "; print_green "${crd_status}"; printf "\n"
}

function reload() {
  /opt/google/chrome-remote-desktop/chrome-remote-desktop --reload
}

function stop() {
  /opt/google/chrome-remote-desktop/chrome-remote-desktop --stop
  rm -rf ${HOME}/.config/chrome-remote-desktop/pulseaudio*
}

function start() {
  if [ ! -f ${HOME}/.chrome-remote-desktop-session ]; then
    print_red "Seems like you haven't set this up yet. Try running: "; printf "\n"
    print_green "crd --setup"; printf "\n"
    exit
  fi

  if [ ! -f ${HOME}/.config/chrome-remote-desktop/host#*.json ]; then
    print_red "Seems like you haven't activated CRD in your browser. Please do that before trying to run the server."; printf "\n"
    exit
  fi

  rm -rf ${HOME}/.config/chrome-remote-desktop/pulseaudio*
  crd_size=$(cat ${HOME}/.config/chrome-remote-desktop/Size)
  if [ -z "${crd_size}" ]; then
    /opt/google/chrome-remote-desktop/chrome-remote-desktop --start
  else
    /opt/google/chrome-remote-desktop/chrome-remote-desktop --size="${crd_size}" --start
  fi
}

function restart() {
  stop
  sleep 1
  start
}

function setup() {
  sudo gpasswd -a ${USER} chrome-remote-desktop
  print_blue "Checking that working directory and session file are present"; printf "\n"
  print_blue "That would be "; print_green "${HOME}/.config/chrome-remote-desktop"; print_blue " and"; printf "\n"
  print_green "${HOME}/.chrome-remote-desktop-session"; printf "\n\n"
  [ -d "${HOME}/.config/chrome-remote-desktop" ] || mkdir "${HOME}/.config/chrome-remote-desktop"
  touch ${HOME}/.chrome-remote-desktop-session
  touch ${HOME}/.config/chrome-remote-desktop/Size

  EDITOR="${VISUAL:-${EDITOR:-nano}}"
  if ! which "${EDITOR}" > /dev/null 2>&1; then
    print_red "Editor "; print_green "${EDITOR}"; print_red " not found, please call setup defining an editor first by"; printf "\n"
    print_red "either exporting "; print_green "EDITOR"; print_red " variable or calling command with "; print_green "EDITOR"; print_red " variable"; printf "\n"
    print_red "(e.g. "; print_green "EDITOR="; print_blue "<editor_of_your_choice>"; print_green " crd --setup"; print_red ")"; printf "\n"
    exit
  fi

  crd_session="${HOME}/.chrome-remote-desktop-session"
  if [[ -z $(cat "${crd_session}") ]]; then
    echo "# You will have to uncomment one of the following lines for CRD to work" >> "${crd_session}"
    echo "# Remove the # and save the file." >> "${crd_session}"
    echo "# " >> "${crd_session}"
    echo "export \$(dbus-launch)" >> "${crd_session}"
    grep -R "^Exec=" "/usr/share/xsessions/" | sed "s|/usr/.*=|#exec |" >> "${crd_session}"
  fi
  print_blue "Now entering the editor to make the appropriate changes to"; printf "\n"
  print_blue "your session file."; printf "\n"
  read -rsp $"Press any key to continue..." -n1 key; printf "\n\n"
  "${EDITOR}" "${crd_session}"
  sleep 0.5

  print_blue "############################################################"; printf "\n"
  crd_size="${HOME}/.config/chrome-remote-desktop/Size"
  print_blue "If you want to set a default size for all clients, please"; printf "\n"
  print_blue "add a value with format "; print_green "[width]x[height] "; print_blue "(e.g "; print_green "1360x768"; print_blue ")"; printf "\n"
  print_blue "in file "; print_green "${crd_size}"; print_blue "."; printf "\n\n"
  print_blue "Remember that this will affect all clients you use."; printf "\n"
  print_blue "If you dont want a default size please leave it blank."; printf "\n\n"
  print_blue "Now entering the editor to make the appropriate changes to"; printf "\n"
  print_blue "your Size file. Do not enter any comments to this file."; printf "\n"
  read -rsp $"Press any key to continue..." -n1 key; printf "\n\n"
  "${EDITOR}" "${crd_size}"
  sleep 0.5

  print_blue "############################################################"; printf "\n"
  print_blue "This completes the setup."; printf "\n\n"
  print_blue "Please remember that you will need to allow Chrome or Chromium"; printf "\n"
  print_blue "to act as a server for this to work at all."; printf "\n\n"
  print_blue "To do that, open "; print_green "https://remotedesktop.google.com/headless/"; printf "\n"
  print_blue "in your chrome or chromium browser and follow the instructions."; printf "\n\n"
  print_blue "If you want to start the service at boot, issue the command:"; printf "\n"
  print_green "systemctl enable chrome-remote-desktop@\${USER}"; printf "\n\n"
}

function help() {
  print_blue "Note: You will have to go into chrome or chromium to enable remote"; printf "\n"
  print_blue "connections to this computer before you can run CRD on this machine."; printf "\n\n"
  print_blue "Usage: "; print_green "crd [option]"; printf "\n\n"
  print_blue "Options:"; printf "\n\n"
  print_green "--status"; printf "\n"
  print_blue "Checks whether CRD is running and returns its status."; printf "\n\n"
  print_green "--start"; printf "\n"
  print_blue "Starts CRD after destroying old pulse files."; printf "\n\n"
  print_green "--stop"; printf "\n"
  print_blue "Stops CRD if running, deletes old pulse files."; printf "\n\n"
  print_green "--restart"; printf "\n"
  print_blue "Stops and starts CRD, destroying non-functioning pulse files."; printf "\n\n"
  print_green "--reload"; printf "\n"
  print_blue "Just reloads CRD."; printf "\n\n"
  print_green "--help, -h"; printf "\n"
  print_blue "This help message."; printf "\n\n"
  print_green "--setup"; printf "\n"
  print_blue "Sets up CRD for your system by adding folders, sessions, users"; printf "\n"
  print_blue "and stuff. You should do this first, after a fresh install."; printf "\n\n"
  print_blue "No sound on client? Try returning the files "; print_green "/etc/pulse/daemon.conf"; printf "\n"
  print_blue "and "; print_green "/etc/pulse/client.conf"; print_blue " to their default values, that is, the"; printf "\n"
  print_blue "values commented out with a ';' – deleting any uncommented settings"; printf "\n"
  print_blue "might do the trick, but use your common sense here."; printf "\n\n"
  print_blue "Need another resolution and your Display function on the client"; printf "\n"
  print_blue "throws an error? You can change the client resolution in the host by"; printf "\n"
  print_blue "editing the file: "; print_green "${HOME}/.config/chrome-remote-desktop/Size"; printf "\n"
  print_blue "and adjusting it to whatever resolution you need."; printf "\n"
  print_blue "This will affect all clients though."; printf "\n\n"
}

if [[ $(whoami) = "root" ]]
then
  print_red "Please run this as a normal user!"; printf "\n"
  exit
fi

case $1 in

--status)
  status
  ;;

--restart)
  restart
  ;;

--reload)
  reload
  ;;

--stop)
  stop
  ;;

--start)
  start
  ;;

--setup)
  setup
  ;;

--help|-h)
  help
  ;;

*)
  help
  ;;

esac