#!/bin/bash

function usage {
  echo "Usage: $(basename "$0") [ --setup [-u] | --init [-m -e -d] [sitename] | --start [-b] | -h (--help) | -d (--developer) [sitename] | -a (--add) | -c \"Command to be sent to Frappe Bench on Docker\""
  echo ''
  echo 'where:'
  echo '    dbench    loads up container'
  echo '    -c "command"   send a command to bench in the container'
  echo '    -h | --help   show this help text'
  echo '    -d | --developer [sitename]    enables developer mode for "sitename" (if not specified, it will default to site1.local)'  
  echo '    -a | --add   adds site-names to /etc/hosts file in the container to facilitate multisite access'
  echo '    --setup [-u]   builds docker containers, NOTE: assumes you have docker installed'
  echo '            -u    start up docker containers as well'
  echo '    --init [-m -e -d] [sitename] initializes frappe-bench in docker and adds a site "sitename" (if not specified, it will default to site1.local)'
  echo '           -e  initializes frappe-bench and installs erpnext'
  echo '    --start [-b]   starts frappe docker'
  echo '            -b    starts bench as well'
}

function frappe_installer {
  echo "starting frappe_docker setup"
  docker exec -i -u root frappe bash -c "cd /home/frappe && chown -R frappe:frappe ./*" 
  docker exec -it frappe bash -c "cd .. && bench init frappe-bench --ignore-exist --skip-redis-config-generation && cd frappe-bench"
  docker exec -it frappe bash -c "mv Procfile_docker Procfile && mv sites/common_site_config_docker.json sites/common_site_config.json"
  echo "frappe-bench folder setup"
  docker exec -it -u root frappe bash -c "apt-get install vim -y && apt-get install sudo -y && usermod -aG sudo frappe && printf '# User rules for frappe\nfrappe ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/frappe"
  echo "adding $1"
  docker exec -it frappe bash -c "bench new-site $1"
  docker exec -i -u root frappe bash -c "echo 127.0.0.1   $1 >> /etc/hosts"
  sudo su -c 'echo 127.0.0.1   $1 >> /etc/hosts'
  echo "$1 added"
}


add=0
setup=0
up=0
start=0
init=0
dev=0
erp=0
mgr=0
site=0
bench=0
cmd=0

positional=()

if [ $# == 0 ]; then
  docker exec -it frappe bash
  exit 0
fi

while [[ $# -gt 0 ]]; do
key="$1"

  case "$key" in
    -h | --help)
      usage
      exit 0
      ;;
    -a | --add)
      add=1
      ;;
    -d | --developer)
      dev=1
      ;;
    -c)
      cmd=1
      ;;
    -e)
      erp=1
      ;;
    -u)
      up=1
      ;;
    -m)
      mgr=1
      ;;
    -b)
      bench=1
      ;;
    --setup)
      setup=1
      ;;
    --init)
      init=1
      ;;
    --start)
      start=1
      ;;
    *)
      positional+=("$key")
      ;;
    esac
    shift
done
set -- "${positional[@]}"

site="$1"
if [ -z "$1" ]; then
 site="site1.local"
fi


if [ $setup == 1 ]; then
  docker-compose build
  if [ $up == 1 ]; then
    docker-compose up -d
  else
    docker-compose up
  fi
  exit 0
fi

if [ $init == 1 ]; then

  frappe_installer "$site"

  if [ $mgr == 1 ]; then
    echo "installing bench manager"
    docker exec -it frappe bash -c "bench setup manager"
  fi

  if [ $erp == 1 ]; then
    echo "installing erpnext"
    docker exec -it frappe bash -c "bench get-app erpnext"
    docker exec -it frappe bash -c "bench --site $site install-app erpnext"
    docker exec -it -u root frappe bash -c "bench --site $site set-config \"developer_mode\" 1 &&  bench clear-cache"
    echo "finished"
  fi
  
  if [ $dev == 1 ]; then
    docker exec -it -u root frappe bash -c "bench --site $site set-config \"developer_mode\" 1 &&  bench clear-cache"
  fi
  exit 0
fi

if [ $dev == 1 ]; then
  if [ "$site" == 0 ]; then
    site="site1.local"
  fi
   docker exec -it -u root frappe bash -c "bench --site $site set-config \"developer_mode\" 1 &&  bench clear-cache"
   exit 0
fi

if [ $start == 1 ]; then
  docker-compose start
  ./dbench -a
  if [ $bench == 1 ]; then
    docker exec -it frappe bash -c "bench start"
  fi
  exit 0
fi

if [ $dev == 1 ]; then
  docker exec -it -u root frappe bash -c "bench --site $site set-config \"developer_mode\" 1 &&  bench clear-cache"
  exit 0
fi

if [ $cmd == 1 ]; then
  docker exec -it frappe bash -c "bench $*"
  exit 0
fi

if [ $add == 1 ]; then
  a=$(docker exec -i frappe bash -c "cd ~/frappe-bench && ls sites/*/site_config.json" | grep -o '/.\+/')
  a="${a//$'\n'/ }"
  a=$(echo "$a" | tr -d / )
  result="127.0.0.1 ${a}"
  echo "$result"
  docker exec -u root -i frappe bash -c "echo ${result} | tee --append /etc/hosts"
  docker exec -itu root frappe bash -c "printf '# User rules for frappe\nfrappe ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/frappe"
  exit 0
fi

if $*; then
  echo "Incorrect option $*, please make sure you are entering the correct commands"
  usage
  exit 1
fi 

exit 0