#!/bin/sh
#
# Starts fqlink daemon on the UIX (Ultratronix7 board)
#

DAEMON_FQLINK_NAME=fqlink_can_app
DAEMON_FQLINK_DIR=/opt/fqlink/can_app/bin
FQLINK_PID_FILE=/var/run/fqlink_can_app.pid
FQLINK_LOGGER_PID_FILE=/var/run/fqlink_can_app_logger.pid

DAEMON_IOTAGENT_NAME=iotagent_aws
DAEMON_IOTAGENT_DIR=/opt/fqlink/iotagent_aws/bin
IOTAGENT_PID_FILE=/var/run/iotagent_aws.pid
IOTAGENT_LOGGER_PID_FILE=/var/run/iotagent_aws_logger.pid
WDT_DIR_PATH="/tmp/wdt"

start_daemon() {
    NAME=$1
    BIN_DIR=$2
    PID_FILE=$3
    LOGGER_PID_FILE=$4

    BIN="$BIN_DIR/$NAME"

    # Check if already running
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if kill -0 "$PID" 2>/dev/null; then
            echo "$NAME already running (PID $PID)"
            return 0
        else
            echo "Removing stale PID file for $NAME"
            rm -f "$PID_FILE"
        fi
    fi

    LOG_FILE=$(mktemp)

    echo "Starting $NAME..."

    $BIN >> "$LOG_FILE" 2>&1 &
    DAEMON_PID=$!
    echo "$DAEMON_PID" > "$PID_FILE"

    tail -n 0 -f "$LOG_FILE" | logger -t "$NAME" &
    echo $! > "$LOGGER_PID_FILE"

    echo "$NAME started (PID $DAEMON_PID)"
}


stop_daemon() {
    NAME=$1
    PID_FILE=$2
    LOGGER_PID_FILE=$3

    file="$WDT_DIR_PATH/$NAME"
    rm $file

    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        echo "Stopping $NAME (PID $PID)..."

        # graceful stop
        kill -TERM "$PID" 2>/dev/null

        # wait up to 5 seconds
        for i in 1 2 3 4 5; do
            if ! kill -0 "$PID" 2>/dev/null; then
                break
            fi
            sleep 1
        done

        # force kill if still alive
        if kill -0 "$PID" 2>/dev/null; then
            echo "$NAME did not stop gracefully, killing..."
            kill -KILL "$PID" 2>/dev/null
        fi

        rm -f "$PID_FILE"
    else
        echo "$NAME not running"
    fi

    # stop logger
    if [ -f "$LOGGER_PID_FILE" ]; then
        kill "$(cat "$LOGGER_PID_FILE")" 2>/dev/null
        rm -f "$LOGGER_PID_FILE"
    fi
}


start() {
    echo "Starting FQlink stack..."
    umask 077
    sleep 5

    # Start watchdog (non-blocking)
    if [ -x /etc/init.d/K96fqlink_backup ]; then
        /etc/init.d/K96fqlink_backup start &
    fi

    # IoT Agent
    start_daemon "$DAEMON_IOTAGENT_NAME" \
                 "$DAEMON_IOTAGENT_DIR" \
                 "$IOTAGENT_PID_FILE" \
                 "$IOTAGENT_LOGGER_PID_FILE"

    # Prestart hook
    if [ -x /opt/fqlink/can_app/script/prestart_fqlink.sh ]; then
        /opt/fqlink/can_app/script/prestart_fqlink.sh
    fi

    # CAN app
    start_daemon "$DAEMON_FQLINK_NAME" \
                 "$DAEMON_FQLINK_DIR" \
                 "$FQLINK_PID_FILE" \
                 "$FQLINK_LOGGER_PID_FILE"
}


stop() {
    echo "Stopping FQlink stack..."

    # IMPORTANT: stop watchdog first if you don't want auto-restart
    if [ -x /etc/init.d/K96fqlink_backup ]; then
        /etc/init.d/K96fqlink_backup stop
    fi

    stop_daemon "$DAEMON_FQLINK_NAME" \
                "$FQLINK_PID_FILE" \
                "$FQLINK_LOGGER_PID_FILE"

    stop_daemon "$DAEMON_IOTAGENT_NAME" \
                "$IOTAGENT_PID_FILE" \
                "$IOTAGENT_LOGGER_PID_FILE"

    sleep 2
}


restart() {
    stop
    start
}


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        restart
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

exit 0
