#!/usr/bin/env bash

###############################################################################
# KYGnus Web File Manager
#
# This launcher is responsible for starting main.py as the configured
# desktop user.
#
# main.py remains unchanged and continues to use:
#
#     getpass.getuser()
#
# Therefore Flask sees the correct user and ROOT_DIR becomes:
#
#     /home/<user>
###############################################################################

set -u

APP_NAME="ourfiles"

APP_DIR="/usr/share/ourfiles"

MAIN_APP="${APP_DIR}/main.py"

PYTHON_BIN="${APP_DIR}/venv/bin/python"

CONFIG_DIR="/etc/ourfiles"

ENV_FILE="${CONFIG_DIR}/environment"

DATA_DIR="/var/lib/ourfiles"

LOG_DIR="${DATA_DIR}/logs"

LOG_FILE="${LOG_DIR}/ourfiles.log"

PID_FILE="${DATA_DIR}/ourfiles.pid"

APP_PORT="5010"

APP_URL="http://127.0.0.1:${APP_PORT}"


# ============================================================================
# Load Environment
# ============================================================================

if [ -f "$ENV_FILE" ]; then

    set -a

    . "$ENV_FILE"

    set +a

fi


# ============================================================================
# Detect Application User
# ============================================================================

RUN_USER="${FILE_MANAGER_USER:-}"


if [ -z "$RUN_USER" ]; then

    if [ -n "${SUDO_USER:-}" ] &&
       [ "${SUDO_USER}" != "root" ] &&
       id "${SUDO_USER}" >/dev/null 2>&1; then

        RUN_USER="${SUDO_USER}"

    elif [ -n "${USER:-}" ] &&
         [ "${USER}" != "root" ] &&
         id "${USER}" >/dev/null 2>&1; then

        RUN_USER="${USER}"

    else

        RUN_USER="$(logname 2>/dev/null || true)"

    fi

fi


# ============================================================================
# Validate User
# ============================================================================

if [ -z "$RUN_USER" ] ||
   ! id "$RUN_USER" >/dev/null 2>&1; then

    echo
    echo "ERROR: Could not determine application user."
    echo
    echo "Configuration:"
    echo
    echo "  $ENV_FILE"
    echo
    echo "Set:"
    echo
    echo "  FILE_MANAGER_USER=<username>"
    echo

    exit 1

fi


RUN_GROUP="$(id -gn "$RUN_USER" 2>/dev/null || true)"

RUN_HOME="$(getent passwd "$RUN_USER" | cut -d: -f6 2>/dev/null || true)"


if [ -z "$RUN_HOME" ]; then

    RUN_HOME="/home/${RUN_USER}"

fi


# ============================================================================
# Validate Application
# ============================================================================

if [ ! -f "$MAIN_APP" ]; then

    echo
    echo "ERROR: main.py not found:"
    echo
    echo "  $MAIN_APP"
    echo

    exit 1

fi


if [ ! -x "$PYTHON_BIN" ]; then

    echo
    echo "ERROR: Python virtual environment not found:"
    echo
    echo "  $PYTHON_BIN"
    echo

    exit 1

fi


# ============================================================================
# Browser
# ============================================================================

open_browser()
{
    URL="$1"

    if [ -z "${DISPLAY:-}" ] &&
       [ -z "${WAYLAND_DISPLAY:-}" ]; then

        echo
        echo "No graphical desktop session detected."
        echo
        echo "Open manually:"
        echo
        echo "  $URL"
        echo

        return 0

    fi


    if command -v xdg-open >/dev/null 2>&1; then

        xdg-open "$URL" >/dev/null 2>&1 &

    elif command -v sensible-browser >/dev/null 2>&1; then

        sensible-browser "$URL" >/dev/null 2>&1 &

    elif command -v firefox >/dev/null 2>&1; then

        firefox "$URL" >/dev/null 2>&1 &

    elif command -v chromium >/dev/null 2>&1; then

        chromium "$URL" >/dev/null 2>&1 &

    elif command -v chromium-browser >/dev/null 2>&1; then

        chromium-browser "$URL" >/dev/null 2>&1 &

    else

        echo
        echo "Browser not found."
        echo
        echo "Open manually:"
        echo
        echo "  $URL"
        echo

    fi
}


# ============================================================================
# Run As Application User
# ============================================================================

run_as_user()
{
    if [ "$(id -un)" = "$RUN_USER" ]; then

        "$@"

        return $?

    fi


    if [ "$(id -u)" -eq 0 ] &&
       command -v runuser >/dev/null 2>&1; then

        runuser \
            -u "$RUN_USER" \
            -- \
            "$@"

        return $?

    fi


    if command -v sudo >/dev/null 2>&1; then

        sudo \
            -u "$RUN_USER" \
            "$@"

        return $?

    fi


    echo
    echo "ERROR: Cannot execute application as:"
    echo
    echo "  $RUN_USER"
    echo
    echo "Neither runuser nor sudo is available."
    echo

    return 1
}


# ============================================================================
# Is Running
# ============================================================================

is_running()
{
    if ! command -v curl >/dev/null 2>&1; then

        return 1

    fi

    curl \
        -fsS \
        --max-time 2 \
        "$APP_URL" \
        >/dev/null 2>&1
}


# ============================================================================
# Start Application
# ============================================================================

start_application()
{
    if is_running; then

        echo
        echo "KYGnus Web File Manager is already running."
        echo
        echo "User:"
        echo "  $RUN_USER"
        echo
        echo "Home:"
        echo "  $RUN_HOME"
        echo
        echo "URL:"
        echo "  $APP_URL"
        echo

        return 0

    fi


    mkdir -p "$LOG_DIR" 2>/dev/null || true


    # Make runtime directories owned by application user.
    if [ "$(id -u)" -eq 0 ]; then

        chown \
            "$RUN_USER:$RUN_GROUP" \
            "$DATA_DIR" \
            "$LOG_DIR" \
            >/dev/null 2>&1 || true

    fi


    echo
    echo "============================================================"
    echo " Starting KYGnus Web File Manager"
    echo "============================================================"
    echo
    echo "Application user:"
    echo "  $RUN_USER"
    echo
    echo "Home directory:"
    echo "  $RUN_HOME"
    echo
    echo "Application:"
    echo "  $MAIN_APP"
    echo
    echo "URL:"
    echo "  $APP_URL"
    echo


    if [ "$(id -u)" -eq 0 ] &&
       command -v runuser >/dev/null 2>&1; then

        runuser \
            -u "$RUN_USER" \
            -- \
            env \
            HOME="$RUN_HOME" \
            USER="$RUN_USER" \
            LOGNAME="$RUN_USER" \
            FILE_MANAGER_USER="$RUN_USER" \
            FILE_MANAGER_PORT="$APP_PORT" \
            nohup \
            "$PYTHON_BIN" \
            "$MAIN_APP" \
            >> "$LOG_FILE" 2>&1 &

        APP_PID=$!


    elif [ "$(id -un)" = "$RUN_USER" ]; then

        env \
            HOME="$RUN_HOME" \
            USER="$RUN_USER" \
            LOGNAME="$RUN_USER" \
            FILE_MANAGER_USER="$RUN_USER" \
            FILE_MANAGER_PORT="$APP_PORT" \
            nohup \
            "$PYTHON_BIN" \
            "$MAIN_APP" \
            >> "$LOG_FILE" 2>&1 &

        APP_PID=$!


    elif command -v sudo >/dev/null 2>&1; then

        sudo \
            -u "$RUN_USER" \
            env \
            HOME="$RUN_HOME" \
            USER="$RUN_USER" \
            LOGNAME="$RUN_USER" \
            FILE_MANAGER_USER="$RUN_USER" \
            FILE_MANAGER_PORT="$APP_PORT" \
            nohup \
            "$PYTHON_BIN" \
            "$MAIN_APP" \
            >> "$LOG_FILE" 2>&1 &

        APP_PID=$!


    else

        echo
        echo "ERROR: Cannot start application as $RUN_USER."
        echo

        return 1

    fi


    echo "$APP_PID" > "$PID_FILE" 2>/dev/null || true


    if [ "$(id -u)" -eq 0 ]; then

        chown \
            "$RUN_USER:$RUN_GROUP" \
            "$PID_FILE" \
            >/dev/null 2>&1 || true

    fi


    echo "PID:"
    echo "  $APP_PID"
    echo

    echo "Waiting for Flask server..."


    for i in $(seq 1 30); do

        sleep 1


        if is_running; then

            echo
            echo "============================================================"
            echo " Web File Manager is ready"
            echo "============================================================"
            echo
            echo "User:"
            echo "  $RUN_USER"
            echo
            echo "Home:"
            echo "  $RUN_HOME"
            echo
            echo "URL:"
            echo "  $APP_URL"
            echo

            return 0

        fi


        if [ -f "$PID_FILE" ] &&
           ! kill -0 "$APP_PID" >/dev/null 2>&1; then

            echo
            echo "ERROR: Application stopped unexpectedly."
            echo
            echo "Last log output:"
            echo

            tail -n 50 "$LOG_FILE" \
                2>/dev/null || true

            return 1

        fi

    done


    echo
    echo "WARNING: Flask did not respond within 30 seconds."
    echo
    echo "Check:"
    echo
    echo "  $LOG_FILE"
    echo

    return 1
}


# ============================================================================
# Stop
# ============================================================================

stop_application()
{
    if [ -f "$PID_FILE" ]; then

        PID="$(cat "$PID_FILE" 2>/dev/null || true)"


        if [ -n "$PID" ] &&
           kill -0 "$PID" >/dev/null 2>&1; then

            echo
            echo "Stopping ourfiles..."
            echo "PID: $PID"
            echo


            if [ "$(id -u)" -eq 0 ]; then

                kill "$PID" >/dev/null 2>&1 || true

            else

                kill "$PID" >/dev/null 2>&1 || true

            fi


            sleep 2

        fi


        rm -f "$PID_FILE"

    fi


    echo "ourfiles stopped."
}


# ============================================================================
# Status
# ============================================================================

status_application()
{
    echo
    echo "============================================================"
    echo " KYGnus Web File Manager"
    echo "============================================================"
    echo
    echo "User:"
    echo "  $RUN_USER"
    echo
    echo "Home:"
    echo "  $RUN_HOME"
    echo
    echo "URL:"
    echo "  $APP_URL"
    echo


    if is_running; then

        echo "Status:"
        echo "  RUNNING"

    else

        echo "Status:"
        echo "  STOPPED"

    fi


    echo
}


# ============================================================================
# Logs
# ============================================================================

show_logs()
{
    if [ -f "$LOG_FILE" ]; then

        tail -n 100 "$LOG_FILE"

    else

        echo
        echo "No log file found:"
        echo
        echo "  $LOG_FILE"
        echo

    fi
}


# ============================================================================
# Foreground
# ============================================================================

run_foreground()
{
    cd "$APP_DIR" || exit 1


    run_as_user \
        env \
        HOME="$RUN_HOME" \
        USER="$RUN_USER" \
        LOGNAME="$RUN_USER" \
        FILE_MANAGER_USER="$RUN_USER" \
        FILE_MANAGER_PORT="$APP_PORT" \
        "$PYTHON_BIN" \
        "$MAIN_APP"
}


# ============================================================================
# Commands
# ============================================================================

case "${1:-start}" in

    start)

        start_application

        open_browser "$APP_URL"

        ;;


    stop)

        stop_application

        ;;


    restart)

        stop_application

        sleep 1

        start_application

        open_browser "$APP_URL"

        ;;


    status)

        status_application

        ;;


    logs)

        show_logs

        ;;


    open)

        open_browser "$APP_URL"

        ;;


    run)

        run_foreground

        ;;


    version)

        echo "KYGnus Web File Manager ${APP_VERSION:-1.0.2}"

        ;;


    *)

        echo
        echo "KYGnus Web File Manager"
        echo
        echo "Usage:"
        echo
        echo "  ourfiles              Start and open browser"
        echo "  ourfiles start        Start application"
        echo "  ourfiles stop         Stop application"
        echo "  ourfiles restart      Restart application"
        echo "  ourfiles status       Show status"
        echo "  ourfiles logs         Show logs"
        echo "  ourfiles open         Open browser"
        echo "  ourfiles run          Run in foreground"
        echo "  ourfiles version      Show version"
        echo

        exit 1

        ;;

esac

exit 0
