#!/bin/bash
# Multithreaded Deployment Script
# Builds natively on astra (aarch64), deploys to /opt/multithreaded.
# Run from the multithreaded project root.
#
# Usage:
#   ./deploy/deploy.sh              # Build + deploy + restart
#   ./deploy/deploy.sh --setup      # First-time: create user, dirs, db, build, install, seed

set -e

# Configuration
SERVER="max@100.106.221.39"
REMOTE_DIR="/opt/multithreaded"
SRC_DIR="src/multithreaded"
BINARY_NAME="multithreaded"
DEPLOY_DIR="deploy"

# Check we're in the right directory
if [ ! -f "Cargo.toml" ] || ! grep -q 'name = "multithreaded"' Cargo.toml; then
    echo "Error: Run this script from the MNW/multithreaded/ directory"
    exit 1
fi

rsync_source() {
    echo "[rsync] Uploading source to $SERVER:~/$SRC_DIR/..."
    ssh $SERVER "mkdir -p ~/$SRC_DIR"
    rsync -az --delete \
        --exclude target/ \
        --exclude .env \
        --exclude .git/ \
        ./ $SERVER:~/$SRC_DIR/

    # Sync shared dependencies (Cargo.toml references ../shared/ from ~/src/multithreaded/)
    local shared_dir
    shared_dir="$(cd ../shared && pwd)"
    for dep in docengine tagtree s3-storage; do
        local dep_dir="$shared_dir/$dep"
        if [ -d "$dep_dir" ]; then
            echo "[rsync] Syncing shared dep: $dep"
            ssh $SERVER "mkdir -p ~/src/shared/$dep"
            rsync -az --delete --exclude target --exclude .git \
                "$dep_dir/" "$SERVER:~/src/shared/$dep/"
        fi
    done
    echo "[rsync] Done"
}

build_remote() {
    echo "[build] Building release on astra..."
    ssh $SERVER "cd ~/$SRC_DIR && ~/.cargo/bin/cargo build --release 2>&1"
    echo "[build] Done"
}

deploy_files() {
    echo "[deploy] Stopping service + copying binary + assets to $REMOTE_DIR..."
    ssh $SERVER "
        sudo systemctl stop multithreaded || true
        sudo cp ~/$SRC_DIR/target/release/$BINARY_NAME $REMOTE_DIR/$BINARY_NAME
        sudo chmod +x $REMOTE_DIR/$BINARY_NAME
        sudo rsync -a --delete ~/$SRC_DIR/static/ $REMOTE_DIR/static/
        sudo rsync -a --delete ~/$SRC_DIR/migrations/ $REMOTE_DIR/migrations/
        sudo chown -R multithreaded:multithreaded $REMOTE_DIR
    "
    echo "[deploy] Done"
}

restart_app() {
    echo "[restart] Restarting multithreaded..."
    ssh $SERVER "sudo systemctl restart multithreaded"
    sleep 2
    echo ""
    ssh $SERVER "sudo systemctl status multithreaded --no-pager"
    echo ""
    echo "[health] Checking..."
    ssh $SERVER "curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:3400/"
}

first_time_setup() {
    echo "=== First-Time Setup ==="

    echo "[setup] Creating system user..."
    ssh $SERVER "
        sudo useradd --system --shell /usr/sbin/nologin --home-dir $REMOTE_DIR multithreaded 2>/dev/null || echo 'User already exists'
    "

    echo "[setup] Creating directories..."
    ssh $SERVER "
        sudo mkdir -p $REMOTE_DIR
        sudo chown multithreaded:multithreaded $REMOTE_DIR
    "

    echo "[setup] Creating database role + database..."
    ssh $SERVER "
        sudo -u postgres createuser multithreaded 2>/dev/null || echo 'Role already exists'
        createdb multithreaded 2>/dev/null || echo 'Database already exists'
        sudo -u postgres psql -c 'GRANT ALL PRIVILEGES ON DATABASE multithreaded TO multithreaded;' 2>/dev/null
        sudo -u postgres psql -d multithreaded -c 'GRANT ALL ON SCHEMA public TO multithreaded;' 2>/dev/null
    "

    rsync_source
    build_remote

    echo "[setup] Installing files..."
    deploy_files

    echo "[setup] Installing env file..."
    ssh $SERVER "
        sudo cp ~/$SRC_DIR/$DEPLOY_DIR/env.production $REMOTE_DIR/.env
        sudo chmod 600 $REMOTE_DIR/.env
        sudo chown multithreaded:multithreaded $REMOTE_DIR/.env
    "

    echo "[setup] Installing systemd service..."
    ssh $SERVER "
        sudo cp ~/$SRC_DIR/$DEPLOY_DIR/multithreaded.service /etc/systemd/system/multithreaded.service
        sudo systemctl daemon-reload
        sudo systemctl enable multithreaded
    "

    echo "[setup] Starting service..."
    ssh $SERVER "sudo systemctl start multithreaded"
    sleep 2

    echo "[setup] Running seed..."
    ssh $SERVER "
        cd $REMOTE_DIR
        sudo -u multithreaded $REMOTE_DIR/$BINARY_NAME --seed
    "

    echo ""
    ssh $SERVER "sudo systemctl status multithreaded --no-pager"
    echo ""
    echo "[health] Checking..."
    ssh $SERVER "curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:3400/"
}

case "${1:-deploy}" in
    --setup)
        first_time_setup
        ;;
    deploy|"")
        echo "=== Deploy ==="
        rsync_source
        build_remote
        deploy_files
        restart_app
        ;;
    *)
        echo "Usage: $0 [--setup]"
        exit 1
        ;;
esac

echo ""
echo "=== Done ==="
