#!/usr/bin/env bash
# Incremental Dropbox SGVI/EtherGold → ~/EtherGold-Staging (hourly / manual).
#
#   QUIET=1 bash stage_from_dropbox.sh
#   DRY_RUN=1 bash stage_from_dropbox.sh

if grep -q $'\r' "${BASH_SOURCE[0]}" 2>/dev/null; then
  sed -i 's/\r$//' "${BASH_SOURCE[0]}"
  exec bash "${BASH_SOURCE[0]}" "$@"
fi

set -euo pipefail

if [[ "$(id -un)" == root ]]; then
  echo "FATAL: do not run as root/sudo." >&2
  exit 1
fi

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=ethergold_paths.sh
source "${ROOT}/ethergold_paths.sh"
# shellcheck source=ota_lib.sh
source "${ROOT}/ota_lib.sh"
# shellcheck source=dropbox_paths.sh
source "${ROOT}/dropbox_paths.sh"

FILTER_FILE="${ROOT}/ethergold.rclone-filter"
DRY_RUN="${DRY_RUN:-0}"
VERBOSE="${VERBOSE:-1}"
if [[ "${QUIET:-0}" == "1" ]]; then
  VERBOSE=0
fi

load_rclone_remote() {
  local candidate env_file
  for candidate in \
    "${ROOT}/rclone.env" \
    "${HOME}/EtherGold/sync/rclone.env"; do
    if [[ ! -f "${candidate}" ]]; then
      continue
    fi
    env_file="${candidate}"
    if grep -q $'\r' "${env_file}" 2>/dev/null; then
      sed -i 's/\r$//' "${env_file}" 2>/dev/null || true
    fi
    # shellcheck source=/dev/null
    source "${env_file}"
    if [[ -n "${RCLONE_REMOTE:-}" ]]; then
      echo "RCLONE_REMOTE from ${env_file}"
      return 0
    fi
  done
  RCLONE_REMOTE="${RCLONE_REMOTE:-dyzine-dropbox}"
  echo "RCLONE_REMOTE default: ${RCLONE_REMOTE}"
}

load_rclone_remote

if [[ ! -f "${FILTER_FILE}" ]]; then
  echo "Missing ${FILTER_FILE}" >&2
  exit 1
fi

if ! command -v rclone >/dev/null 2>&1; then
  echo "rclone not found." >&2
  exit 1
fi

OTA_CHANNEL="${OTA_CHANNEL:-field}"
if [[ "${OTA_CHANNEL}" == "dev" ]]; then
  DEPLOY_REMOTE="${DROPBOX_ETHERGOLD_DEPLOY_DEV:-SGVI/dev/EtherGold}"
else
  DEPLOY_REMOTE="${DROPBOX_ETHERGOLD_DEPLOY:-${DROPBOX_ETHERGOLD_DEPLOY_CANON:?missing DROPBOX_ETHERGOLD_DEPLOY_CANON}}"
fi
REMOTE_PATH="${RCLONE_REMOTE}:${DEPLOY_REMOTE}"

RCLONE_ARGS=(
  --filter-from "${FILTER_FILE}"
  --create-empty-src-dirs
  --stats 5s
  --stats-one-line
)
if [[ "${VERBOSE}" == "1" ]]; then
  RCLONE_ARGS+=(-v --progress)
else
  RCLONE_ARGS+=(--log-level "${RCLONE_LOG_LEVEL:-NOTICE}")
fi
if [[ "${DRY_RUN}" == "1" ]]; then
  RCLONE_ARGS+=(--dry-run)
fi

echo "Remote:  ${REMOTE_PATH}  (OTA_CHANNEL=${OTA_CHANNEL})"
echo "Stage:   ${ETHERGOLD_STAGING}"
echo "Live:    ${ETHERGOLD_ROOT}"
echo ""

mkdir -p "${ETHERGOLD_STAGING}" "${ETHERGOLD_ROOT}/run" "${ETHERGOLD_SYNC}"

echo "Bootstrap: refresh sync/*.sh from remote"
rclone copy "${REMOTE_PATH}/sync/" "${ROOT}/" ${DRY_RUN:+--dry-run} -v || true

echo "Stage: incremental copy from Dropbox"
rclone copy "${REMOTE_PATH}" "${ETHERGOLD_STAGING}" "${RCLONE_ARGS[@]}"

if [[ "${DRY_RUN}" == "1" ]]; then
  echo "Dry run complete."
  exit 0
fi

find "${ETHERGOLD_STAGING}" -type f -name '*.sh' -exec sed -i 's/\r$//' {} + 2>/dev/null || true
find "${ROOT}" -maxdepth 1 -type f -name '*.sh' -exec sed -i 's/\r$//' {} + 2>/dev/null || true
chmod a+x "${ROOT}"/*.sh 2>/dev/null || true

ota_apply_rollback_directive \
  "${ETHERGOLD_ROOT}" \
  "${ETHERGOLD_STAGING}" \
  "${ETHERGOLD_ROLLBACK}" \
  "${ROOT}/rollback_live.sh"

sv="$(ota_read_version "${ETHERGOLD_STAGING}")"
lv="$(ota_live_version "${ETHERGOLD_ROOT}")"
if ota_version_is_older "${sv}" "${lv}"; then
  echo "staging ${sv} older than live ${lv} — park Staging → Rollback (not pending)"
  ota_park_eg_staging_to_rollback "${ETHERGOLD_STAGING}" "${ETHERGOLD_ROLLBACK}" "${ETHERGOLD_ROOT}"
  rm -f "${ETHERGOLD_PENDING_FLAG}"
  ota_install_eg_deploy_schedule "${ROOT}/install_pi_deploy_schedule.sh"
  LOG_OFFLOAD_PRODUCT=ethergold bash "${ROOT}/log_offload.sh" || echo "WARN: log_offload failed (non-fatal)"
  echo "stage_from_dropbox ok"
  exit 0
fi

stamp_rc=0
ota_staging_differs_by_stamp "${ETHERGOLD_STAGING}" "${ETHERGOLD_ROOT}" || stamp_rc=$?
pending=0
if [[ "${stamp_rc}" -eq 0 ]]; then
  pending=1
elif [[ "${stamp_rc}" -eq 2 ]]; then
  pending=1
fi

if [[ "${pending}" -eq 1 ]]; then
  ota_write_pending_flag "${ETHERGOLD_PENDING_FLAG}" "${ETHERGOLD_STAGING}" "${ETHERGOLD_ROOT}"
  echo "staging-pending: set"
else
  echo "staging-pending: clear"
  rm -f "${ETHERGOLD_PENDING_FLAG}"
fi

ota_install_eg_deploy_schedule "${ROOT}/install_pi_deploy_schedule.sh"

LOG_OFFLOAD_PRODUCT=ethergold bash "${ROOT}/log_offload.sh" || echo "WARN: log_offload failed (non-fatal)"

echo "stage_from_dropbox ok"
