#!/usr/bin/env bash
# Recover kitchen taxonomy from enhanced brochure JSON + publish to Magento/Shopify.
#
# Designed for systemd ExecStart, for example:
#   ExecStart=/bin/bash /home/homesurplus/PlytixMage/scripts/recover_kitchen_taxonomy_and_publish.sh
#
# Default flow:
# 1) Import kitchen_cabinets_taxonomy.json into local brochure taxonomy groups
#    using enhanced brochure_json_2 payloads.
# 2) Sync/create taxonomy nodes in outbound Magento/Shopify channels.
# 3) Repair Magento listing-path targets and live product category links.
# 4) Invalidate stale projection cache rows.
# 5) Full-publish Magento connections, then Shopify.
#
# 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)
#   ALEMBIC                Alembic executable override (default: $VENV_DIR/bin/alembic, fallback: alembic)
#   LOG_DIR                Log directory (default: $APP_ROOT/logs)
#   TAXONOMY_JSON          Path to kitchen_cabinets_taxonomy.json
#                          (default: ../plytixftp.dev.piesol.com/kitchen_cabinets_taxonomy.json)
#   BROCHURE_FOLDER        Path to enhanced brochure json folder
#                          (default: ../plytixftp.dev.piesol.com/brochure_json_2)
#   MAGENTO_CONNECTION_IDS Space-separated Magento connection ids (default: "1 2 4")
#   SHOPIFY_CONNECTION_ID  Shopify connection id (default: 1000001)
#   RUN_ALEMBIC            1 = alembic upgrade head before running (default: 0)
#   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)
#   SKIP_MAGENTO_REPAIR    1 = skip Magento listing-path/category-link repair (default: 0)
#   SKIP_SHOPIFY_PUBLISH   1 = skip Shopify full publish (default: 0)
#   SKIP_MAGENTO_PUBLISH   1 = skip Magento full publish (default: 0)
#   SKIP_REMOTE_TAXONOMY_SYNC 1 = skip sync_master_taxonomy_pipeline (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
if [[ -z "${ALEMBIC:-}" ]]; then
  if [[ -x "$VENV_DIR/bin/alembic" ]]; then
    ALEMBIC="$VENV_DIR/bin/alembic"
  else
    ALEMBIC="alembic"
  fi
else
  ALEMBIC="$ALEMBIC"
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_2}"
MAGENTO_CONNECTION_IDS="${MAGENTO_CONNECTION_IDS:-4 2 1}"
SHOPIFY_CONNECTION_ID="${SHOPIFY_CONNECTION_ID:-1000001}"
RUN_ALEMBIC="${RUN_ALEMBIC:-0}"
DRY_RUN="${DRY_RUN:-0}"
WAIT_TIMEOUT="${WAIT_TIMEOUT:-21600}"
REPAIR_DELAY_MS="${REPAIR_DELAY_MS:-200}"
SKIP_MAGENTO_REPAIR="${SKIP_MAGENTO_REPAIR:-0}"
SKIP_SHOPIFY_PUBLISH="${SKIP_SHOPIFY_PUBLISH:-0}"
SKIP_MAGENTO_PUBLISH="${SKIP_MAGENTO_PUBLISH:-0}"
SKIP_REMOTE_TAXONOMY_SYNC="${SKIP_REMOTE_TAXONOMY_SYNC:-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_${STAMP}.log"
STATUS_FILE="$LOG_DIR/recover_kitchen_taxonomy_latest.status"

cd "$APP_ROOT"
export PYTHONUNBUFFERED=1

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

echo "=== recover kitchen taxonomy + publish ==="
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 "shopify_connection_id=$SHOPIFY_CONNECTION_ID"
echo "run_alembic=$RUN_ALEMBIC"
echo "dry_run=$DRY_RUN"
echo "wait_timeout=$WAIT_TIMEOUT"
echo "repair_delay_ms=$REPAIR_DELAY_MS"
echo "skip_remote_taxonomy_sync=$SKIP_REMOTE_TAXONOMY_SYNC"
echo "skip_magento_repair=$SKIP_MAGENTO_REPAIR"
echo "skip_magento_publish=$SKIP_MAGENTO_PUBLISH"
echo "skip_shopify_publish=$SKIP_SHOPIFY_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
}

IMPORT_ARGS=()
SYNC_ARGS=()
LISTING_REPAIR_ARGS=()
CATEGORY_REPAIR_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)
  CATEGORY_REPAIR_ARGS+=(--apply)
  PROJECTION_FIX_ARGS+=(--fix)
  PUBLISH_ARGS+=(--apply)
fi

if [[ "$RUN_ALEMBIC" == "1" ]]; then
  run_step "alembic_upgrade_head" "$ALEMBIC" upgrade head
fi

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[@]}"}"

if [[ "$SKIP_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
  if [[ -n "$SHOPIFY_CONNECTION_ID" ]]; then
    SYNC_CMD+=(--shopify-connection-id "$SHOPIFY_CONNECTION_ID")
  fi
  SYNC_CMD+=("${SYNC_ARGS[@]+"${SYNC_ARGS[@]}"}")
  run_step "sync_master_taxonomy_pipeline" "${SYNC_CMD[@]}"
fi

if [[ "$SKIP_MAGENTO_REPAIR" != "1" ]]; then
  for magento_id in $MAGENTO_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

for magento_id in $MAGENTO_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

if [[ -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[@]}"
fi

if [[ "$SKIP_MAGENTO_PUBLISH" != "1" ]]; then
  for magento_id in $MAGENTO_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 [[ "$SKIP_SHOPIFY_PUBLISH" != "1" && -n "$SHOPIFY_CONNECTION_ID" ]]; then
  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"
