#!/bin/bash

### Application Configuration
SCRIPT_NAME="teams-wrapper"
LOCAL_COMPUTER_USERNAME=$(whoami)

# registry config
IMAGE_NAME="docker.io/stifstof/teams-desktop:latest"
CONTAINER_NAME="teams"
CONFIG_PATH="${HOME}/.config/Microsoft"

########## Script

# Container runtime (docker or podman)
CONTAINER_ENGINE="${CONTAINER_ENGINE}"
# Local .env
if [ -f "/home/$LOCAL_COMPUTER_USERNAME/Documents/git/TeamsInDocker/.env" ]; then
    # Load Environment Variables
    export $(cat /home/$LOCAL_COMPUTER_USERNAME/Documents/git/TeamsInDocker/.env | grep -v '#' | awk '/=/ {print $1}')
    # For instance, will be example_kaggle_key
    echo $CONTAINER_ENGINE
fi
if [ -z "$CONTAINER_ENGINE" ]
then
  echo "\$CONTAINER_ENGINE is empty. Defaulting to docker"
  CONTAINER_ENGINE="docker"
fi

PATH=/home/cn/Documents/git/TeamsInDocker/bin:/usr/sbin:/usr/bin:/sbin:/bin
TEAMS_DESKTOP_USER=${LOCAL_COMPUTER_USERNAME}
XSOCK=/home/$TEAMS_DESKTOP_USER/X/teamsOne/.X11-unix
XAUTH=/home/$TEAMS_DESKTOP_USER/X/teamsOne/."${CONTAINER_ENGINE}".xauth

# do we need to use sudo to start containers?
if [ "$CONTAINER_ENGINE" == "docker" ]; then
(id -Gn | grep -q $CONTAINER_ENGINE) || SUDO=sudo
fi

USER_UID=$(id -u)
USER_GID=$(id -g)


DOWNLOAD_DIR=$(xdg-user-dir DOWNLOAD)
if [ -z "${DOWNLOAD_DIR}" ]; then
  DOWNLOAD_DIR="${HOME}/Downloads"
fi

list_commands() {
  echo ""
  echo "Launch teams using:"
  echo "  teams-wrapper teams"
  echo ""
  exit 1
}

cleanup_stopped_teams_desktop_instances() {
  echo "Cleaning up stopped teams instances..."
  for c in $(${SUDO} ${CONTAINER_ENGINE} ps -a -q); do
    image="$(${SUDO} ${CONTAINER_ENGINE} inspect -f {{.Name}} ${c})"
    if [ "${image}" == "${CONTAINER_NAME}" ]; then
      running=$(${SUDO} ${CONTAINER_ENGINE} inspect -f {{.State.Running}} ${c})
      if [ "${running}" != "true" ]; then
        ${SUDO} ${CONTAINER_ENGINE} rm "${c}" >/dev/null
      fi
      if [ "${running}" == "true" ]; then
        ${SUDO} ${CONTAINER_ENGINE} kill "${c}" >/dev/null
        ${SUDO} ${CONTAINER_ENGINE} rm "${c}" >/dev/null
      fi
    fi
  done
}

prepare_extra_arguments() {
  if [ "$CONTAINER_ENGINE" == "docker" ]; then
    TEAMS_EXTRA_CONTAINER_ARGUMENTS+="--privileged"
  fi
}

prepare_container_env_parameters() {
  ENV_VARS+=" --env=USER_UID=${USER_UID}"
  ENV_VARS+=" --env=USER_GID=${USER_GID}"
  ENV_VARS+=" --env=DISPLAY=unix$DISPLAY"
  ENV_VARS+=" --env=XAUTHORITY=${XAUTH}"
  ENV_VARS+=" --env=TZ=$(date +%Z)"
  ENV_VARS+=" --env=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket"
}

create_x_folder() {
  mkdir "/home/$TEAMS_DESKTOP_USER/X/teamsOne/"
  touch ${XAUTH}
  touch ${XSOCK}
}

prepare_container_volume_parameters() {
  if [ -d "/home/$TEAMS_DESKTOP_USER/X/teamsOne/" ]; then
    rm -rf "/home/$TEAMS_DESKTOP_USER/X/teamsOne/"
  fi
  create_x_folder

  xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f ${XAUTH} nmerge -

  VOLUMES+=" --volume=${CONFIG_PATH}:/home/${TEAMS_DESKTOP_USER}/.config/Microsoft/"
  VOLUMES+=" --volume=${XSOCK}:${XSOCK}"
  VOLUMES+=" --volume=${XAUTH}:${XAUTH}"
  VOLUMES+=" --volume=/run/user/${USER_UID}/pulse:/run/pulse"
  VOLUMES+=" --volume=/run/user/${USER_UID}/bus:/run/dbus/system_bus_socket"

  if [ -d "${HOME}/tmp" ]; then
    VOLUMES+=" --volume=${HOME}/tmp:/home/${TEAMS_DESKTOP_USER}/tmp"
  fi

}

prepare_container_device_parameters() {
  # enumerate video devices for webcam support
  VIDEO_DEVICES=
  for device in /dev/video*; do
    if [ -c $device ]; then
      VIDEO_DEVICES="${VIDEO_DEVICES} --device $device:$device"
    fi
  done
}

prog=$(basename $0)
exec=$(which $prog)

if [[ ${prog} == ${SCRIPT_NAME} ]]; then
  case ${1} in
  teams)
    prog=${1}
    shift
    ;;
  * | help)
    list_commands
    exit 1
    ;;
  esac
elif [[ -n ${exec} ]]; then
  # launch host binary if it exists
  exec ${exec} $@
fi

cleanup_stopped_teams_desktop_instances
prepare_container_env_parameters
prepare_container_volume_parameters
prepare_container_device_parameters
prepare_extra_arguments

echo "Starting ${prog}..."
set -o xtrace
${SUDO} ${CONTAINER_ENGINE} run -d \
  --name ${CONTAINER_NAME} \
  --network host \
  --memory=4g \
  --shm-size=4g \
  --device /dev/dri \
  --device /dev/snd \
  ${TEAMS_EXTRA_CONTAINER_ARGUMENTS} \
  ${ENV_VARS} \
  ${VIDEO_DEVICES} \
  ${VOLUMES} \
  ${IMAGE_NAME} ${prog} $@ >/dev/null
