#!/bin/bash

if [[ "$PATH" != *"$SNAP_INSTANCE_NAME"* ]]; then
  export PATH="${PATH/\/snap\/wekan\//\/snap\/$SNAP_INSTANCE_NAME\/}"
fi

# get wekan/mongo settings
source $SNAP/bin/wekan-read-settings

export NODE_PATH=$SNAP/bin
# Use user-provided MONGO_URL if set, otherwise build from components
if [ -n "$MONGO_URL" ]; then
    echo "Using user-provided MONGO_URL"
elif [ "nill" != "$MONGODB_BIND_UNIX_SOCKET" ] && [ "x" != "x$MONGODB_BIND_UNIX_SOCKET" ]; then
    if [ -d $MONGODB_BIND_UNIX_SOCKET ]; then
        export MONGO_URL="mongodb://$MONGODB_BIND_UNIX_SOCKET/mongodb-${MONGODB_PORT}.sock/wekan"
    else
        export MONGO_URL="mongodb://$SNAP_DATA/shared/$MONGODB_BIND_UNIX_SOCKET/wekan"
    fi
else
    [ "x" == "x$MONGODB_BIND_IP" ] && MONGODB_BIND_IP="127.0.0.1"
    export MONGO_URL="mongodb://$MONGODB_BIND_IP:$MONGODB_PORT/wekan"
    if [ -z "$MONGO_OPLOG_URL" ]; then
        export MONGO_OPLOG_URL="mongodb://$MONGODB_BIND_IP:$MONGODB_PORT/local?replicaSet=rs0"
    fi
fi

# If WRITABLE_PATH is not set, use $SNAP_COMMON/files
# Wekan will store attachments there.
if [ -z "$WRITABLE_PATH" ]; then
    export WRITABLE_PATH="$SNAP_COMMON/files"
fi
# Create attachments and avatars directories
mkdir -p "$WRITABLE_PATH/attachments"
mkdir -p "$WRITABLE_PATH/avatars"
echo -e "Using WRITABLE_PATH: $WRITABLE_PATH"

echo -e "MONGO_URL=$MONGO_URL"

# Wait for MongoDB replica set primary to be ready before starting WeKan.
# With changeStreams, Meteor requires the replica set primary to be elected.
# Large databases can take minutes to replay the WiredTiger journal after a snap update.
if [ "true" != "${DISABLE_MONGODB}" ]; then
    echo "Waiting for MongoDB replica set primary..."
    MONGO_BIN="$SNAP/bin/mongosh"
    MONGO_PORT="${MONGODB_PORT:-27019}"
    MONGO_HOST="${MONGODB_BIND_IP:-127.0.0.1}"
    # After WEKAN_DB_WAIT_TIMEOUT seconds (default 120) print the English upgrade
    # guidance once, then keep retrying (large databases can take minutes to
    # replay the WiredTiger journal after a snap update).
    WEKAN_DB_WAIT_TIMEOUT=${WEKAN_DB_WAIT_TIMEOUT:-120}
    db_waited=0
    db_hint_shown=false
    until "$MONGO_BIN" --host "$MONGO_HOST" --port "$MONGO_PORT" --quiet \
        --eval "try { quit(rs.status().ok === 1 && rs.isMaster().ismaster ? 0 : 1) } catch(e) { quit(1) }" \
        >/dev/null 2>&1; do
        if [ "$db_hint_shown" != "true" ] && [ "$db_waited" -ge "$WEKAN_DB_WAIT_TIMEOUT" ]; then
            echo ""
            echo "========================================================================"
            echo "WeKan: still cannot connect to MongoDB."
            echo ""
            echo "If you just upgraded WeKan or MongoDB, the existing database may have"
            echo "been created by an OLDER MongoDB version that the new MongoDB cannot"
            echo "open, so MongoDB never finishes starting and WeKan keeps waiting here."
            echo ""
            echo "Upgrade the database - dump with the old version, restore with the new:"
            echo "  1. Start the OLD, previously-working MongoDB version."
            echo "  2. Back up:   mongodump --archive=wekan.archive --gzip"
            echo "  3. Stop old MongoDB. Start the NEW MongoDB on an EMPTY data dir."
            echo "  4. Restore:   mongorestore --archive=wekan.archive --gzip --drop"
            echo "  5. Start WeKan again."
            echo ""
            echo "Attachments and avatars are stored ON DISK under WRITABLE_PATH, NOT"
            echo "in MongoDB, so when moving to a new server ALSO copy that whole"
            echo "directory (it contains 'files', 'attachments' and 'avatars'):"
            echo "  - Snap:   /var/snap/wekan/common/files"
            echo "  - Docker: the 'wekan-files' volume mounted at /data"
            echo "  - Source: the WRITABLE_PATH you configured"
            echo ""
            echo "Also check the MongoDB log (snap logs ${SNAP_NAME:-wekan}.mongodb) for"
            echo "the real reason: incompatible featureCompatibilityVersion, wrong mongod"
            echo "version, or an unclean shutdown needing 'mongod --repair'."
            echo "========================================================================"
            echo ""
            db_hint_shown=true
        fi
        echo "MongoDB not ready yet, retrying in 5 seconds..."
        sleep 5
        db_waited=$((db_waited + 5))
    done
    echo "MongoDB replica set primary is ready."
fi

APPLICATION_DIRECTORY=$SNAP
APPLICATION_START=main.js
cd $APPLICATION_DIRECTORY
#$NODE_PATH/node $APPLICATION_START
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
#   export NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
#   bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
#bash -c "ulimit -s 65500; exec $NODE_PATH/node --stack-size=65500 $APPLICATION_START"
#bash -c "ulimit -s 65500; exec $NODE_PATH/node --stack-size=65500 --max-old-space-size=8192 $APPLICATION_START"
bash -c "ulimit -s 65500; exec $NODE_PATH/node $APPLICATION_START"
