#!/usr/bin/env bash
# Resume kitchen taxonomy recovery after connection 4 repair completed and
# connection 2 can be skipped.
#
# Intended recovery point:
# - import_kitchen_cabinets_taxonomy already completed
# - sync_master_taxonomy_pipeline already completed
# - Magento repair already completed for connection 4
# - Magento repair for connection 2 is intentionally skipped
# - Magento repair still needed for connection 1
# - projection cleanup + publish still needed for connections 4 and 1
#
# Default flow:
# 1) Repair Magento listing-path targets and category links for connection 1.
# 2) Invalidate stale projection cache rows for Magento 4 and 1.
# 3) Full-publish Magento 4 and 1.
# 4) Optionally run Shopify projection cleanup + publish.
#
# Env:
#   APP_ROOT               PlytixMage root (default: script parent/..)
#   VENV_DIR               Virtualenv directory (default: $APP_ROOT/.venv)
#   PYTHON                 Python interpreter override (default: $VENV_DIR/bin/python, fallback: python)
#   LOG_DIR                Log directory (default: $APP_ROOT/logs)
#   DRY_RUN                1 = preview only; no writes/pushes (default: 0)
#   WAIT_TIMEOUT           channel_full_publish wait timeout seconds (default: 21600)
#   REPAIR_DELAY_MS        Delay between Magento repair API calls (default: 200)
#   REPAIR_CONNECTION_IDS  Magento connections that still need repair (default: "1")
#   PUBLISH_CONNECTION_IDS Magento connections that still need projection+publish (default: "4 1")
#   SHOPIFY_CONNECTION_ID  Shopify connection id (default: 1000001)
#   RUN_SHOPIFY            1 = also run Shopify projection+publish (default: 0)
#   SKIP_MAGENTO_REPAIR    1 = skip Magento repair phase (default: 0)
#   SKIP_MAGENTO_PUBLISH   1 = skip Magento projection+publish phase (default: 0)
#   FORCE_PRODUCTS         1 = force product republish during channel_full_publish (default: 1)
#   RUN_PULL_AFTER         1 = Magento pull after each Magento publish (default: 1)

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_ROOT="$(cd "${APP_ROOT:-$SCRIPT_DIR/..}" && pwd)"
VENV_DIR="${VENV_DIR:-$APP_ROOT/.venv}"
if [[ -z "${PYTHON:-}" ]]; then
  if [[ -x "$VENV_DIR/bin/python" ]]; then
    PYTHON="$VENV_DIR/bin/python"
  else
    PYTHON="python"
  fi
else
  PYTHON="$PYTHON"
fi

LOG_DIR="${LOG_DIR:-$APP_ROOT/logs}"
DRY_RUN="${DRY_RUN:-0}"
WAIT_TIMEOUT="${WAIT_TIMEOUT:-21600}"
REPAIR_DELAY_MS="${REPAIR_DELAY_MS:-200}"
REPAIR_CONNECTION_IDS="${REPAIR_CONNECTION_IDS:-1}"
PUBLISH_CONNECTION_IDS="${PUBLISH_CONNECTION_IDS:-4 1}"
SHOPIFY_CONNECTION_ID="${SHOPIFY_CONNECTION_ID:-1000001}"
RUN_SHOPIFY="${RUN_SHOPIFY:-0}"
SKIP_MAGENTO_REPAIR="${SKIP_MAGENTO_REPAIR:-0}"
SKIP_MAGENTO_PUBLISH="${SKIP_MAGENTO_PUBLISH:-0}"
FORCE_PRODUCTS="${FORCE_PRODUCTS:-1}"
RUN_PULL_AFTER="${RUN_PULL_AFTER:-1}"

mkdir -p "$LOG_DIR"
STAMP="$(date -u +%Y%m%dT%H%M%SZ)"
LOG_FILE="$LOG_DIR/recover_kitchen_taxonomy_resume_4_1_${STAMP}.log"
STATUS_FILE="$LOG_DIR/recover_kitchen_taxonomy_resume_4_1_latest.status"

cd "$APP_ROOT"
export PYTHONUNBUFFERED=1

exec > >(tee -a "$LOG_FILE") 2>&1

echo "=== resume recover kitchen taxonomy + publish (4/1) ==="
echo "started_utc=$STAMP"
echo "app_root=$APP_ROOT"
echo "repair_connection_ids=$REPAIR_CONNECTION_IDS"
echo "publish_connection_ids=$PUBLISH_CONNECTION_IDS"
echo "shopify_connection_id=$SHOPIFY_CONNECTION_ID"
echo "run_shopify=$RUN_SHOPIFY"
echo "dry_run=$DRY_RUN"
echo "wait_timeout=$WAIT_TIMEOUT"
echo "repair_delay_ms=$REPAIR_DELAY_MS"
echo "skip_magento_repair=$SKIP_MAGENTO_REPAIR"
echo "skip_magento_publish=$SKIP_MAGENTO_PUBLISH"
echo "force_products=$FORCE_PRODUCTS"
echo "run_pull_after=$RUN_PULL_AFTER"
echo "log_file=$LOG_FILE"
echo "python=$PYTHON ($("$PYTHON" --version 2>&1 || true))"
echo

fail() {
  local step="$1"
  local code="$2"
  echo "FAILED step=$step exit=$code"
  echo "failed:$step:$code:$(date -u +%Y%m%dT%H%M%SZ)" >"$STATUS_FILE"
  exit "$code"
}

run_step() {
  local name="$1"
  shift
  echo
  echo "------------------------------------------------------------"
  echo "STEP: $name"
  echo "CMD: $*"
  echo "started: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
  echo "------------------------------------------------------------"
  if "$@"; then
    echo "OK: $name ($(date -u +%Y-%m-%dT%H:%M:%SZ))"
  else
    local code=$?
    fail "$name" "$code"
  fi
}

LISTING_REPAIR_ARGS=()
CATEGORY_REPAIR_ARGS=()
PROJECTION_FIX_ARGS=()
PUBLISH_ARGS=()

if [[ "$DRY_RUN" == "1" ]]; then
  echo "DRY_RUN=1 - preview mode only"
else
  LISTING_REPAIR_ARGS+=(--apply)
  CATEGORY_REPAIR_ARGS+=(--apply)
  PROJECTION_FIX_ARGS+=(--fix)
  PUBLISH_ARGS+=(--apply)
fi

if [[ "$SKIP_MAGENTO_REPAIR" != "1" ]]; then
  for magento_id in $REPAIR_CONNECTION_IDS; do
    LISTING_CMD=(
      "$PYTHON" -m app.jobs.repair_magento_listing_path_targets
      --connection-id "$magento_id"
      --provision-unmatched
    )
    CATEGORY_CMD=(
      "$PYTHON" -m app.jobs.repair_magento_product_category_links
      --connection-id "$magento_id"
      --all-assigned
      --delay-ms "$REPAIR_DELAY_MS"
    )
    LISTING_CMD+=("${LISTING_REPAIR_ARGS[@]+"${LISTING_REPAIR_ARGS[@]}"}")
    CATEGORY_CMD+=("${CATEGORY_REPAIR_ARGS[@]+"${CATEGORY_REPAIR_ARGS[@]}"}")

    run_step "repair_magento_listing_path_targets_conn_${magento_id}" "${LISTING_CMD[@]}"
    run_step "repair_magento_product_category_links_conn_${magento_id}" "${CATEGORY_CMD[@]}"
  done
fi

if [[ "$SKIP_MAGENTO_PUBLISH" != "1" ]]; then
  for magento_id in $PUBLISH_CONNECTION_IDS; do
    PROJECTION_CMD=(
      "$PYTHON" -m app.jobs.inspect_channel_projection
      --channel magento
      --connection-id "$magento_id"
    )
    PROJECTION_CMD+=("${PROJECTION_FIX_ARGS[@]+"${PROJECTION_FIX_ARGS[@]}"}")
    run_step "inspect_channel_projection_magento_conn_${magento_id}" "${PROJECTION_CMD[@]}"
  done

  for magento_id in $PUBLISH_CONNECTION_IDS; do
    MAGENTO_PUBLISH_CMD=(
      "$PYTHON" -m app.jobs.channel_full_publish
      --channel magento
      --magento-connection-id "$magento_id"
      --skip-pull
      --taxonomy-mode link-only
      --wait-timeout "$WAIT_TIMEOUT"
    )
    if [[ "$FORCE_PRODUCTS" == "1" ]]; then
      MAGENTO_PUBLISH_CMD+=(--force-products)
    fi
    if [[ "$RUN_PULL_AFTER" == "1" ]]; then
      MAGENTO_PUBLISH_CMD+=(--run-pull-after)
    fi
    MAGENTO_PUBLISH_CMD+=("${PUBLISH_ARGS[@]+"${PUBLISH_ARGS[@]}"}")
    run_step "channel_full_publish_magento_conn_${magento_id}" "${MAGENTO_PUBLISH_CMD[@]}"
  done
fi

if [[ "$RUN_SHOPIFY" == "1" && -n "$SHOPIFY_CONNECTION_ID" ]]; then
  SHOPIFY_PROJECTION_CMD=(
    "$PYTHON" -m app.jobs.inspect_channel_projection
    --channel shopify
    --connection-id "$SHOPIFY_CONNECTION_ID"
  )
  SHOPIFY_PROJECTION_CMD+=("${PROJECTION_FIX_ARGS[@]+"${PROJECTION_FIX_ARGS[@]}"}")
  run_step "inspect_channel_projection_shopify_conn_${SHOPIFY_CONNECTION_ID}" "${SHOPIFY_PROJECTION_CMD[@]}"

  SHOPIFY_PUBLISH_CMD=(
    "$PYTHON" -m app.jobs.channel_full_publish
    --channel shopify
    --shopify-connection-id "$SHOPIFY_CONNECTION_ID"
    --skip-pull
    --taxonomy-mode link-only
    --wait-timeout "$WAIT_TIMEOUT"
  )
  if [[ "$FORCE_PRODUCTS" == "1" ]]; then
    SHOPIFY_PUBLISH_CMD+=(--force-products)
  fi
  SHOPIFY_PUBLISH_CMD+=("${PUBLISH_ARGS[@]+"${PUBLISH_ARGS[@]}"}")
  run_step "channel_full_publish_shopify_conn_${SHOPIFY_CONNECTION_ID}" "${SHOPIFY_PUBLISH_CMD[@]}"
fi

echo
echo "=== completed successfully $(date -u +%Y-%m-%dT%H:%M:%SZ) ==="
echo "ok:$(date -u +%Y%m%dT%H%M%SZ)" >"$STATUS_FILE"
echo "status_file=$STATUS_FILE"
echo "log_file=$LOG_FILE"
