#!/usr/bin/env bash
# setting the locale, some users have issues with different locales, this forces the correct one
export LC_ALL=en_US.UTF-8

current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$current_dir/utils.sh"

get_cpids_linux() {
  local ppid="$1"
  local cpids
  local cpid
  echo "$ppid"
  cpids="$(pgrep -P "$ppid")"
  for cpid in $cpids; do
    get_cpids_linux "$cpid"
  done
}

get_cpids_unix() {
  local ppid="$1"
  local cpids
  local cpid
  echo "$ppid"
  cpids="$(pgrep -aP "$ppid")"
  for cpid in $cpids; do
    get_cpids_unix "$cpid"
  done
}

kb_to_mb() {
  if [ $# == 0 ]; then
    read -r num
  else
    num="$1"
  fi
  bc <<< "scale=3;$num/1024"
}

kb_to_gb() {
  if [ $# == 0 ]; then
    read -r num
  else
    num="$1"
  fi
  bc <<< "scale=6;$num/1048576"
}

round() {
  if [ $# == 1 ]; then
    read -r num
    scale="$1"
  elif [ $# == 2 ]; then
    num="$1"
    scale="$2"
  fi
  printf "%.${scale}f" "${num}"
}

get_tmux_ram_usage()
{
  local pid
  local pids
  local total_mem_kb=0
  local total_mem_mb=0
  local total_mem_gb=0
  pid="$(tmux display-message -pF '#{pid}')"
  case $(uname -s) in
    Linux)
      if command -v pstree > /dev/null; then
        pids="$(pstree -Tlp "$pid" | tr -d '\n' | sed -rn -e 's/[^()]*\(([0-9]+)\)[^()]*/\1,/g' -e 's/,$//p')"
      else
        pids="$(get_cpids_linux "$pid" | tr '\n' ',')"
      fi
      total_mem_kb="$(ps -o rss= -p "$pids" | paste -sd+ | bc)"
      ;;

    Darwin)
      if command -v pstree > /dev/null; then
        pids="$(pstree -w "$pid" | sed -En 's/[^0-9]+([0-9]+) .*/\1/p' | tr '\n' ',')"
      else
        pids="$(get_cpids_unix "$pid" | tr '\n' ',')"
      fi
      total_mem_kb="$(ps -o rss= -p "$pids" | paste -sd+ - | bc)"
      ;;

    FreeBSD)
      # TODO check FreeBSD compatibility
      if command -v pstree > /dev/null; then
        pids="$(pstree -lp "$pid" | sed -En 's/[^0-9]+([0-9]+) .*/\1/p' | tr '\n' ',')"
      else
        pids="$(get_cpids_unix "$pid" | tr '\n' ',')"
      fi
      total_mem_kb="$(ps -o rss= -p "$pids" | paste -sd+ - | bc)"
      ;;

    CYGWIN*|MINGW32*|MSYS*|MINGW*)
      # TODO - windows compatability
      ;;
  esac
  total_mem_mb=$(kb_to_mb "$total_mem_kb" | round 0)
  total_mem_gb=$(kb_to_gb "$total_mem_kb" | round 0)

  if (( total_mem_gb > 0)); then
    echo "${total_mem_gb}GB"
  elif (( total_mem_mb > 0 )); then
    echo "${total_mem_mb}MB"
  else
    echo "${total_mem_kb}kB"
  fi
}

main()
{
  ram_label=$(get_tmux_option "@dracula-tmux-ram-usage-label" "MEM")
  ram_usage=$(get_tmux_ram_usage)
  echo "$ram_label $ram_usage"
}

#run main driver
main
