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

# Build Vite assets locally, update the remote app, and upload assets to cPanel production.
# The production host cannot run `npm run build`.
#
# Usage (from the project root):
#   ./deploy-assets.sh
#   ./deploy-assets.sh --skip-build
#   ./deploy-assets.sh --password 'your-password'
#   DEPLOY_PASSWORD='your-password' ./deploy-assets.sh
#
# Remote steps (before asset upload):
#   git pull
#   php artisan migrate --force
#
# Override defaults with env vars:
#   DEPLOY_HOST=my2880@srv07.queenbmarketing.uk
#   DEPLOY_PATH=public_html/jctcrm.co.uk
#   DEPLOY_PASSWORD=...

cd "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

DEPLOY_HOST="${DEPLOY_HOST:-my2880@srv07.queenbmarketing.uk}"
DEPLOY_PATH="${DEPLOY_PATH:-public_html/jctcrm.co.uk}"
DEPLOY_PASSWORD="${DEPLOY_PASSWORD:-}"
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
            ;;
        --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,21p' "$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_ROOT="~/${DEPLOY_PATH}"

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

    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 ssh \
        -o StrictHostKeyChecking=accept-new \
        "$DEPLOY_HOST" \
        "$@"
}

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

    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 \
        "$@"
}

echo "==> Checking remote Laravel root at ${DEPLOY_HOST}:${REMOTE_ROOT}"
if ! remote_ssh "test -d ${REMOTE_ROOT}"; then
    echo "Remote Laravel root not found: ${REMOTE_ROOT}" >&2
    echo "Set DEPLOY_PATH to your remote Laravel root, e.g.:" >&2
    echo "  DEPLOY_PATH=public_html/jctcrm.co.uk ./deploy-assets.sh" >&2
    exit 1
fi

echo "==> Pulling latest code on remote"
remote_ssh "cd ${REMOTE_ROOT} && git pull"

echo "==> Running remote database migrations"
remote_ssh "cd ${REMOTE_ROOT} && php artisan migrate --force"

echo "==> Ensuring remote asset directories exist"
remote_ssh "mkdir -p ${REMOTE_ROOT}/public/build"

if [[ "$SKIP_BUILD" -eq 0 ]]; then
    echo "==> Building Vite assets"
    npm run build
else
    echo "==> Skipping build (--skip-build)"
fi

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

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

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