#! /usr/bin/env bash

RPH_UID=${RPH_UID:-${UID}}

rph-docker-exec () {
    docker exec $1 runtipi-host "${@:2}"
}

rph-shell() {
    if rph-docker-exec "" true; then
         rph-docker-exec "-it --user ${RPH_UID}" bash
    fi
}

rph-exec () {
    local set_x=" set -x; pwd; id; "
    [ -z "$QUIET" ] || set_x=""
    local cli="cd ${START_DIR:-/srv/runtipi};${set_x} ${1:?Must supply command} "
    if [ -n "$ROOT_EXEC" ]; then
        cli="$cli ${*:2}"
    else
        cli="$cli "${2:+"$(
            printf '\"%s\" ' "${@:2}"
        )"}
    fi

    if rph exec runtipi true; then
        if [ -n "$ROOT_EXEC" ]; then
           rph exec runtipi /bin/bash <<<"$cli"
        else
           rph shell --uid "${RPH_UID}" runtipi /bin/bash -c "$cli"
        fi
    else
        echo "ERROR: ${_ERROR_MGS:-"Please check if runtipi jail has started! Have you tried 'full-start'?"}" >&2
        exit -1
    fi
}

runtipi-cli() {
    rph-exec ./runtipi-cli "${@}"    
}

runtipi-app-docker-compose() {
    local APP="${1:-Must supply app name}"
    local LOCAL_YML="user-config/${APP}/docker-compose.yml"

    rph exec runtipi test -e "/srv/runtipi/${LOCAL_YML}" || LOCAL_YML=""
    [ -z "$LOCAL_YML" ] || LOCAL_YML="--file ${LOCAL_YML}"

    rph-exec docker compose \
        --env-file user-config/.env.local \
        --env-file app-data/${APP}/app.env \
        --env-file user-config/${APP}/app.env \
        --project-name ${APP} \
        --file apps/${APP}/docker-compose.yml \
        --file repos/29ca930bfdaffa1dfabf5726336380ede7066bc53297e3c0c868b27c97282903/apps/docker-compose.common.yml \
        ${LOCAL_YML} ${@:2}
}

dls() {
    # Default docker ps format is:
    # rph-exec docker ps --format "table {{ .ID }}\t{{ .Image }}\t{{ .Command }}\t{{ .Created }}\t{{ .Status }}\t{{ .Ports }}\t{{ .Names }}"

    local base='{{.Status}}\t{{.ID}}\t{{.Names}}\t{{.Image}}' #'\t{{.Networks}}\t{{.Ports}}\t{{.Mounts}}'
    local compose='{{.Label "com.docker.compose.project"}}\t{{.Label "com.docker.compose.service"}}'
    local format="table $compose\t$base"
    ROOT_EXEC=1 QUIET=${QUIET:-0} rph-exec \
        docker "container ls --all --format '$format' | ( sed -u '1s/.*/\U&/; q'; sed -Ee 's|^|555|; s|^555runtipi|000runtipi|;' | sort | sed -Ee 's/^[[:digit:]]{3}//' )"
}

case "${1}" in
    cli)
        runtipi-cli "${@:2}"
        ;;
    log)
        rph-exec "POSTGRES_PASSWORD=_ TIPI_VERSION=_ LOCAL_DOMAIN=_ DOMAIN=_" docker compose --env-file user-config/.env.local logs --tail=${TAIL:-40} "${2:-runtipi}" ${3:+"${@:3}"}
        ;;
    start)
        runtipi-cli start --env-file user-config/.env.local --no-permissions
        ;;
    update)
        runtipi-cli update --env-file user-config/.env.local --no-permissions "${2:?Must supply version}" "${@:3}"
        ;;
    full-start)
        if ! rph exec runtipi true; then
            rph start runtipi 
            sleep 1s
        fi
        _ERROR_MSG="ERROR: failed to invoke a command inside the runtipi jail and can't start the jail." \
        runtipi-cli start --env-file user-config/.env.local --no-permissions
        ;;
    shell)
        rph-shell
        ;;
    exec)
        rph-exec "${@:2}"
        ;;
    docker)
        rph-exec docker "${@:2}"
        ;;
    dls)
        dls "${@:2}"
        ;;
    dcoapp)
        runtipi-app-docker-compose "${@:2}"
        ;;
    dockge)
        START_DIR=/srv/dockge/stacks/${2:?Must supply stack name} rph-exec docker compose "${@:3}"
        ;;
    setup)
        ln -s $2 "$(cd "$(dirname "$0")" && pwd)/$(basename "$0")" "$HOME/.local/bin/"
        ;;
    *)
        printf '%s    %-12s %s\n' \
            "" "" ""\
            "Usage:" "" ""\
            "  $(basename "$0") <command> [args...]" "" ""\
            "" "" "" \
            "Available commands:" "" ""\
            "" "" "" \
            "runtipi" "" ""\
            "" "cli"        "runtipi-cli" \
            "" "full-start" "start runtipi jail, following with starting runtipi" \
            "" "log"        "runtipi docker stack logs" \
            "" "start"      "start runtipi" \
            "" "update"     "update runtipi to a specific version" \
            "" "" "" \
            "docker/docker-compose" "" ""\
            "" "dcoapp"     "docker compose for runtipi apps" \
            "" "dls"        "stylized docker ls" \
            "" "docker"     "docker" \
            "" "dockge"     "docker compose for dockge stacks" \
            "" "" "" \
            "misc." "" ""\
            "" "exec"       "execute within the shell, START_DIR env applies" \
            "" "shell"      "enter an insteractive shell" \
            "" "" "" \
            "" "setup"      "setup runtipictl in user's .local/bin dir" \
            "" "" "" \
            "Related env. vars:" "" "" \
            "" "VISUAL EDITOR RPH_UID QUIET START_DIR ROOT_EXEC" ""

        ;;
esac