#!/usr/bin/env bash
# Apply corrected kitchen Magento taxonomy fixes for connections 4 then 1.
#
# Prefer the all-in-one daemon script for a full master+remote run:
#   bash scripts/fix_kitchen_taxonomy_all_4_1.sh
#
# Intended for the post-filter Magento contract:
#   category_links = L3 leaf + collection + all-products only
#   shopping_* attrs = shopping_collection / shopping_l1 / shopping_l2
#
# Default flow (master catalog is shared; Magento writes are per connection):
# 1) Optional: re-import kitchen_cabinets_taxonomy.json + brochure folder (once).
# 2) Optional: sync/create master taxonomy channel links for Magento 4 and 1.
# 3) For Magento connection 4, then 1:
#    a) Repair listing-path targets (--provision-unmatched)
#    b) Fast outbound: repair live category_links + products-only force upsert
#       (python -m app.jobs.push_magento_taxonomy_outbound)
#    c) Invalidate stale projection cache rows
# 4) Optional: full channel_full_publish per connection (off by default; outbound
#    push already force-upserts products).
#
# Env:
#   APP_ROOT                 PlytixMage root (default: script parent/..)
#   VENV_DIR                 Virtualenv directory (default: $APP_ROOT/.venv)
#   PYTHON                   Python interpreter override
#   LOG_DIR                  Log directory (default: $APP_ROOT/logs)
#   TAXONOMY_JSON            Path to kitchen_cabinets_taxonomy.json
#   BROCHURE_FOLDER          Path to enhanced brochure json folder
#   MAGENTO_CONNECTION_IDS   Order matters (default: "4 1")
#   PATH_PREFIX              Listing-path prefix for outbound SKUs (default: kitchen-cabinets)
#   DRY_RUN                  1 = preview only (default: 0)
#   WAIT_TIMEOUT             Wait timeout for outbound/publish (default: 21600)
#   REPAIR_DELAY_MS          Delay between Magento category-link API calls (default: 200)
#   RUN_IMPORT               1 = import kitchen taxonomy + brochure (default: 0)
#   RUN_REMOTE_TAXONOMY_SYNC 1 = sync_master_taxonomy_pipeline for 4+1 (default: 1)
#   SKIP_LISTING_REPAIR      1 = skip repair_magento_listing_path_targets (default: 0)
#   SKIP_TAXONOMY_OUTBOUND   1 = skip push_magento_taxonomy_outbound (default: 0)
#   SKIP_PROJECTION_FIX      1 = skip inspect_channel_projection --fix (default: 0)
#   RUN_FULL_PUBLISH         1 = also run channel_full_publish per connection (default: 0)
#   FORCE_PRODUCTS           1 = --force-products on full publish (default: 1)
#   RUN_PULL_AFTER           1 = --run-pull-after on full publish (default: 1)
#   RUN_WORKER               1 = claim queued Magento jobs in-process while waiting (default: 1)
#   OUTBOUND_LIMIT           Optional max SKUs for taxonomy outbound (default: unset)
#
# Examples:
#   DRY_RUN=1 bash scripts/recover_kitchen_taxonomy_fix_magento_4_1.sh
#   bash scripts/recover_kitchen_taxonomy_fix_magento_4_1.sh
#   RUN_IMPORT=1 bash scripts/recover_kitchen_taxonomy_fix_magento_4_1.sh
#   RUN_FULL_PUBLISH=1 bash scripts/recover_kitchen_taxonomy_fix_magento_4_1.sh

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}"
TAXONOMY_JSON="${TAXONOMY_JSON:-../plytixftp.dev.piesol.com/kitchen_cabinets_taxonomy.json}"
BROCHURE_FOLDER="${BROCHURE_FOLDER:-../plytixftp.dev.piesol.com/brochure_json_3}"
MAGENTO_CONNECTION_IDS="${MAGENTO_CONNECTION_IDS:-4 1}"
PATH_PREFIX="${PATH_PREFIX:-kitchen-cabinets}"
DRY_RUN="${DRY_RUN:-0}"
WAIT_TIMEOUT="${WAIT_TIMEOUT:-21600}"
REPAIR_DELAY_MS="${REPAIR_DELAY_MS:-200}"
RUN_IMPORT="${RUN_IMPORT:-0}"
RUN_REMOTE_TAXONOMY_SYNC="${RUN_REMOTE_TAXONOMY_SYNC:-1}"
SKIP_LISTING_REPAIR="${SKIP_LISTING_REPAIR:-0}"
SKIP_TAXONOMY_OUTBOUND="${SKIP_TAXONOMY_OUTBOUND:-0}"
SKIP_PROJECTION_FIX="${SKIP_PROJECTION_FIX:-0}"
RUN_FULL_PUBLISH="${RUN_FULL_PUBLISH:-0}"
FORCE_PRODUCTS="${FORCE_PRODUCTS:-1}"
RUN_PULL_AFTER="${RUN_PULL_AFTER:-1}"
RUN_WORKER="${RUN_WORKER:-1}"
OUTBOUND_LIMIT="${OUTBOUND_LIMIT:-}"

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

cd "$APP_ROOT"
export PYTHONUNBUFFERED=1

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

echo "=== kitchen taxonomy Magento fix (connections: $MAGENTO_CONNECTION_IDS) ==="
echo "started_utc=$STAMP"
echo "app_root=$APP_ROOT"
echo "taxonomy_json=$TAXONOMY_JSON"
echo "brochure_folder=$BROCHURE_FOLDER"
echo "magento_connection_ids=$MAGENTO_CONNECTION_IDS"
echo "path_prefix=$PATH_PREFIX"
echo "dry_run=$DRY_RUN"
echo "wait_timeout=$WAIT_TIMEOUT"
echo "repair_delay_ms=$REPAIR_DELAY_MS"
echo "run_import=$RUN_IMPORT"
echo "run_remote_taxonomy_sync=$RUN_REMOTE_TAXONOMY_SYNC"
echo "skip_listing_repair=$SKIP_LISTING_REPAIR"
echo "skip_taxonomy_outbound=$SKIP_TAXONOMY_OUTBOUND"
echo "skip_projection_fix=$SKIP_PROJECTION_FIX"
echo "run_full_publish=$RUN_FULL_PUBLISH"
echo "force_products=$FORCE_PRODUCTS"
echo "run_pull_after=$RUN_PULL_AFTER"
echo "run_worker=$RUN_WORKER"
echo "outbound_limit=${OUTBOUND_LIMIT:-<none>}"
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
}

IMPORT_ARGS=()
SYNC_ARGS=()
LISTING_REPAIR_ARGS=()
OUTBOUND_ARGS=()
PROJECTION_FIX_ARGS=()
PUBLISH_ARGS=()

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

if [[ "$RUN_IMPORT" == "1" ]]; then
  run_step "import_kitchen_cabinets_taxonomy" \
    "$PYTHON" -m app.jobs.import_kitchen_cabinets_taxonomy \
      --file "$TAXONOMY_JSON" \
      --brochure-folder "$BROCHURE_FOLDER" \
      "${IMPORT_ARGS[@]+"${IMPORT_ARGS[@]}"}"
fi

if [[ "$RUN_REMOTE_TAXONOMY_SYNC" == "1" ]]; then
  SYNC_CMD=(
    "$PYTHON" -m app.jobs.sync_master_taxonomy_pipeline
    --skip-pull-remotes
    --taxonomy-mode full
    --skip-product-push
  )
  for magento_id in $MAGENTO_CONNECTION_IDS; do
    SYNC_CMD+=(--magento-connection-id "$magento_id")
  done
  SYNC_CMD+=("${SYNC_ARGS[@]+"${SYNC_ARGS[@]}"}")
  run_step "sync_master_taxonomy_pipeline" "${SYNC_CMD[@]}"
fi

# Connection order is intentional: 4 first, then 1 (or MAGENTO_CONNECTION_IDS override).
for magento_id in $MAGENTO_CONNECTION_IDS; do
  echo
  echo "############################################################"
  echo "# Magento connection $magento_id"
  echo "############################################################"

  if [[ "$SKIP_LISTING_REPAIR" != "1" ]]; then
    LISTING_CMD=(
      "$PYTHON" -m app.jobs.repair_magento_listing_path_targets
      --connection-id "$magento_id"
      --provision-unmatched
    )
    LISTING_CMD+=("${LISTING_REPAIR_ARGS[@]+"${LISTING_REPAIR_ARGS[@]}"}")
    run_step "repair_magento_listing_path_targets_conn_${magento_id}" "${LISTING_CMD[@]}"
  fi

  if [[ "$SKIP_TAXONOMY_OUTBOUND" != "1" ]]; then
    OUTBOUND_CMD=(
      "$PYTHON" -m app.jobs.push_magento_taxonomy_outbound
      --connection-id "$magento_id"
      --path-prefix "$PATH_PREFIX"
      --wait
    )
    if [[ "$RUN_WORKER" == "1" ]]; then
      OUTBOUND_CMD+=(--run-worker)
    fi
    if [[ -n "$OUTBOUND_LIMIT" ]]; then
      OUTBOUND_CMD+=(--limit "$OUTBOUND_LIMIT")
    fi
    OUTBOUND_CMD+=("${OUTBOUND_ARGS[@]+"${OUTBOUND_ARGS[@]}"}")
    run_step "push_magento_taxonomy_outbound_conn_${magento_id}" "${OUTBOUND_CMD[@]}"
  fi

  if [[ "$SKIP_PROJECTION_FIX" != "1" ]]; then
    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[@]}"
  fi

  if [[ "$RUN_FULL_PUBLISH" == "1" ]]; then
    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[@]}"
  fi
done

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"
