#!/bin/sh
set -e
# Absolute PATH to the script (i. e. /srv/json2file-go/bin/script.sh)
SCRIPT="$(readlink -f "$0")"
# Absolute PATH to the script's dir (i. e. /srv/json2file-go/bin)
SCRIPT_DIR="$(dirname "$SCRIPT")"
# Relative PATH from the SCRIPT to the Working directory
WORK_DIR_RELPATH=".."
# Compute Working directory
WORK_DIR="$(readlink -f "$SCRIPT_DIR/$WORK_DIR_RELPATH")"
# Change the current dir to the working one
cd "$WORK_DIR"

# Variables
J2F_HOST="${J2F_HOST:-$IP}"
J2F_PORT="${J2F_HOST:-$PORT}"
J2F_DIRLIST="${J2F_DIRLIST:-$DIRLIST}"
J2F_SOCKET="${J2F_SOCKET:-$SOCKET}"
J2F_CERTFILE="${J2F_CERTFILE:-/secrets/cert.pem}"
J2F_KEYFILE="${J2F_KEYFILE:-/secrets/key.pem}"
VERSION="$(sed -e 's/^.*(\(.*\)).*$/\1/; q' debian/changelog)"
IMAGE="json2file-go:${VERSION}"

# Funciones
_build_image() {
  docker image build -t "$IMAGE" .
}

_run() {
    if [ -z "$SERVER_IP" ]; then
        SERVER_IP="0.0.0.0"
    fi
    test -d data || mkdir data
    docker run \
        --detach \
        --env J2F_HOST="${J2F_HOST}" \
        --env J2F_PORT="${J2F_PORT}" \
        --env J2F_CERTFILE="${J2F_CERTFILE}" \
        --env J2F_KEYFILE="${J2F_KEYFILE}" \
        --env J2F_DIRLIST="${J2F_DIRLIST}" \
        --env J2F_SOCKET="${J2F_SOCKET}" \
        --mount "type=bind,src=$(pwd)/data,dst=/data" \
        --mount "type=bind,src=$(pwd)/secrets,dst=/secrets,ro" \
        --name "${IMAGE}" \
        --network host \
        --restart=always \
        "$IMAGE"
}

_logs() {
    docker logs "${IMAGE}" "$@"
}

_ps_status() {
    docker ps -a -f name="${IMAGE}" --format '{{.Status}}' 2> /dev/null || true
}

_inspect_status() {
    docker inspect "${IMAGE}" -f "{{.State.Status}}" 2> /dev/null || true
}

_status() {
    _st="$(_ps_status)"
    if [ -z "$_st" ]; then
        echo "The container '${IMAGE}' does not exist"
        exit 1
    else
        echo "$_st"
    fi
}

_start() {
    _st="$(_inspect_status)"
    if [ -z "$_st" ]; then
        _run
    elif [ "$_st" != "running" ] && [ "$_st" != "restarting" ]; then
        docker start "${IMAGE}"
    fi
}

_stop() {
    _st="$(_inspect_status)"
    if [ "$_st" = "running" ] || [ "$_st" = "restarting" ]; then
        docker stop "${IMAGE}"
    fi
}

_rm() {
    _st="$(_inspect_status)"
    if [ -n "$_st" ]; then
        _stop
        docker rm "${IMAGE}"
    fi
}

_restart() {
    _stop
    _start
}

case "$1" in
build)
    _build_image;;
start)
    _start;;
status)
    _status;;
stop)
    _stop;;
rm)
    _rm;;
restart)
    _restart;;
logs)
    shift;
    _logs "$@";;
*)
    echo "Usage: $0 {build|start|stop|status|restart|rm|logs}"
esac
