#!/bin/sh

docker__compose() {
  CURRENT_UID=$(id -u) CURRENT_GID=$(id -g) command docker compose --env-file .env.sndev "$@"
}

docker__exec() {
  command docker exec -i "$@"
}

docker__sn_lnd() {
  docker__exec -u lnd sn_lnd lncli "$@"
}

docker__stacker_lnd() {
  docker__exec -u lnd stacker_lnd lncli "$@"
}

sndev__start() {
  if [ ! -x "$(command -v docker-compose)" ]; then
    echo "docker compose is not installed"
    echo "installation instructions are here: https://docs.docker.com/desktop/"
    exit 0
  fi

  if ! [ -f .env.sndev ]; then
    echo ".env.sndev does not exist."
    echo "creating from .env.sample"
    cp .env.sample .env.sndev
  fi

  echo "Starting application"
  docker__compose up --build
}

sndev__stop() {
  echo "Stopping application"
  docker__compose down
}

sndev__restart() {
  docker__compose restart
}

sndev__status() {
  shift
  docker__compose ps --format 'table {{.Service}}\t{{.State}}\t{{.Status}}\t{{.Ports}}'
}

sndev__delete() {
  echo "Deleting application"
  docker__compose down --volumes --remove-orphans
}

sndev__fund() {
  shift
  docker__stacker_ln -t payinvoice "$@"
}

sndev__withdraw() {
  shift
  docker__stacker_lnd addinvoice --amt "$@" | jq -r '.payment_request'
}

sndev__psql() {
  docker__exec -t db psql -U sn stackernews
}

sndev__compose() {
  shift
  docker__compose "$@"
}

sndev__sn_lncli() {
  shift
  docker__sn_lnd -t "$@"
}

sndev__stacker_lncli() {
  shift
  docker__stacker_lnd -t "$@"
}

sndev__help() {
    if [ $# -eq 3 ]; then
        call "sndev__$1__$2__$3" "$@"
    elif [ $# -eq 2 ]; then
        call "sndev__$1__$2" "$@"
    else
        help="
                            888
                            888
                            888
      .d8888b  88888b.  .d88888  .d88b.  888  888
     88K      888 '88b d88' 888 d8P  Y8b 888  888
     'Y8888b. 888  888 888  888 88888888 Y88  88P
          X88 888  888 Y88b 888 Y8b.      Y8bd8P
      88888P' 888  888  'Y88888  'Y8888    Y88P

manages a docker based stacker news development environment

USAGE
  $ sndev [COMMAND]

COMMANDS
  help          show help

  env:
    start         start env
    stop          stop env
    restart       restart env
    status        status of env
    delete        delete env

  lnd:
    fund          pay a bolt11 for funding
    withdraw      make a bolt11 for withdrawal

  db:
    psql          open psql on db

  raw:
    compose       call docker compose
    sn_lncli      call lncli on sn_lnd
    stacker_lncli call lncli on stacker_lnd
"
        echo "$help"
    fi
}

call() {
    func=$1
    if type "$func" 1>/dev/null 2>&1; then
        shift
        "$func" "$@"  # invoke our named function w/ all remaining arguments
    else
        sndev__help
        exit 1
    fi
}

call "sndev__$1" "$@"