#!/usr/bin/env bash
set -euo pipefail

# Build Vite client + SSR assets and upload them to cPanel production.
#
# Usage:
#   ./scripts/deploy-assets.sh
#   ./scripts/deploy-assets.sh --skip-build
#   ./scripts/deploy-assets.sh --with-node-modules
#   ./scripts/deploy-assets.sh --password 'your-password'
#   DEPLOY_PASSWORD='your-password' ./scripts/deploy-assets.sh
#
# Override defaults with env vars:
#   DEPLOY_HOST=my2880@srv07.queenbmarketing.uk
#   DEPLOY_PATH=public_html/ordermarket.com
#   DEPLOY_PASSWORD=...
#   DEPLOY_WITH_NODE_MODULES=1

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

DEPLOY_HOST="${DEPLOY_HOST:-my2880@srv07.queenbmarketing.uk}"
DEPLOY_PATH="${DEPLOY_PATH:-public_html/ordermarket.com}"
DEPLOY_PASSWORD="${DEPLOY_PASSWORD:-}"
DEPLOY_WITH_NODE_MODULES="${DEPLOY_WITH_NODE_MODULES:-0}"
SKIP_BUILD=0
ASKPASS_FILE=""

cleanup() {
    if [[ -n "$ASKPASS_FILE" && -f "$ASKPASS_FILE" ]]; then
        rm -f "$ASKPASS_FILE"
    fi
}
trap cleanup EXIT

while [[ $# -gt 0 ]]; do
    case "$1" in
        --skip-build)
            SKIP_BUILD=1
            shift
            ;;
        --with-node-modules)
            DEPLOY_WITH_NODE_MODULES=1
            shift
            ;;
        --password)
            if [[ $# -lt 2 || -z "${2:-}" ]]; then
                echo "--password requires a value" >&2
                exit 1
            fi
            DEPLOY_PASSWORD="$2"
            shift 2
            ;;
        --password=*)
            DEPLOY_PASSWORD="${1#*=}"
            shift
            ;;
        -h|--help)
            sed -n '2,18p' "$0"
            exit 0
            ;;
        *)
            echo "Unknown argument: $1" >&2
            exit 1
            ;;
    esac
done

if [[ -z "$DEPLOY_PASSWORD" ]]; then
    if [[ -t 0 ]]; then
        read -r -s -p "Password for ${DEPLOY_HOST}: " DEPLOY_PASSWORD
        echo
    fi
fi

if [[ -z "$DEPLOY_PASSWORD" ]]; then
    echo "No password provided. Pass --password, set DEPLOY_PASSWORD, or enter it when prompted." >&2
    exit 1
fi

export DEPLOY_PASSWORD

remote_scp() {
    if command -v sshpass >/dev/null 2>&1; then
        sshpass -p "$DEPLOY_PASSWORD" scp \
            -o StrictHostKeyChecking=accept-new \
            -r \
            "$@"
        return
    fi

    # OpenSSH ASKPASS fallback when sshpass is not installed.
    if [[ -z "$ASKPASS_FILE" ]]; then
        ASKPASS_FILE="$(mktemp)"
        cat > "$ASKPASS_FILE" <<'ASK'
#!/bin/sh
printf '%s\n' "$DEPLOY_PASSWORD"
ASK
        chmod 700 "$ASKPASS_FILE"
    fi

    DISPLAY="${DISPLAY:-:0}" \
    SSH_ASKPASS="$ASKPASS_FILE" \
    SSH_ASKPASS_REQUIRE=force \
    setsid -w scp \
        -o StrictHostKeyChecking=accept-new \
        -r \
        "$@"
}

if [[ "$SKIP_BUILD" -eq 0 ]]; then
    echo "==> Building client and SSR assets"
    if [[ -x ./vendor/bin/sail ]] && ./vendor/bin/sail ps >/dev/null 2>&1; then
        ./vendor/bin/sail npm run build
    else
        npm run build
    fi
else
    echo "==> Skipping build (--skip-build)"
fi

if [[ ! -d public/build ]]; then
    echo "Missing public/build — run a build first." >&2
    exit 1
fi

if [[ ! -d bootstrap/ssr ]]; then
    echo "Missing bootstrap/ssr — run a build first." >&2
    exit 1
fi

echo "==> Uploading public/build -> ${DEPLOY_HOST}:${DEPLOY_PATH}/public/"
remote_scp public/build "${DEPLOY_HOST}:${DEPLOY_PATH}/public/"

echo "==> Uploading bootstrap/ssr -> ${DEPLOY_HOST}:${DEPLOY_PATH}/bootstrap/"
remote_scp bootstrap/ssr "${DEPLOY_HOST}:${DEPLOY_PATH}/bootstrap/"

if [[ "$DEPLOY_WITH_NODE_MODULES" == "1" ]]; then
    if [[ ! -d node_modules ]]; then
        echo "Missing node_modules — run npm install (or sail npm install) first." >&2
        exit 1
    fi
    echo "==> Uploading node_modules -> ${DEPLOY_HOST}:${DEPLOY_PATH}/"
    remote_scp node_modules "${DEPLOY_HOST}:${DEPLOY_PATH}/"
else
    echo "==> Skipping node_modules (pass --with-node-modules when needed)"
fi

echo "==> Assets deployed to ${DEPLOY_HOST}:${DEPLOY_PATH}"
