#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
EXTRACTIONFILES_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
REPO_ROOT="$(cd "$EXTRACTIONFILES_ROOT/../../.." && pwd)"

PHP_BIN="${PHP_BIN:-/usr/bin/php}"
EXPORT_PATH="${EXPORT_PATH:-$EXTRACTIONFILES_ROOT/full-export-2026-05-14}"
CONFIG_PATH="${CONFIG_PATH:-$EXTRACTIONFILES_ROOT/full-export-2026-05-14/ImportConfig}"
RUN_PREFIX="${RUN_PREFIX:-$(date +%Y%m%d)-phase1-prod}"
RUN_SUFFIX="${RUN_SUFFIX:-}"
MEMORY_LIMIT="${MEMORY_LIMIT:-1024M}"

REHAU_SOURCE_MANDANT_ID="${REHAU_SOURCE_MANDANT_ID:-152}"
REHAU_COPY_SOURCE_MANDANT_ID="${REHAU_COPY_SOURCE_MANDANT_ID:-214}"
CREATE_DWH_MANDANT="${CREATE_DWH_MANDANT:-1}"
PROVISION_ANSPRECHPARTNER_USERS="${PROVISION_ANSPRECHPARTNER_USERS:-0}"
SEND_PROVISIONING_MAIL="${SEND_PROVISIONING_MAIL:-0}"
TEST_MODE=0

usage() {
  cat <<EOF
Usage:
  $(basename "$0")                Startet alle Produktivblöcke 01-07
  $(basename "$0") 01 03 07       Startet nur die angegebenen Blöcke
  $(basename "$0") --test         Prüft nur die Konfiguration, startet keinen Import
  $(basename "$0") --test 01 03   Prüft nur die angegebenen Blöcke
  $(basename "$0") --run-suffix=b 01
                                  Startet Block 01 mit Run-ID-Suffix

Optionale Umgebungsvariablen:
  PHP_BIN
  EXPORT_PATH
  CONFIG_PATH
  RUN_PREFIX
  RUN_SUFFIX
  MEMORY_LIMIT
  REHAU_SOURCE_MANDANT_ID
  REHAU_COPY_SOURCE_MANDANT_ID
  CREATE_DWH_MANDANT
  PROVISION_ANSPRECHPARTNER_USERS
  SEND_PROVISIONING_MAIL
EOF
}

resolve_block_config() {
  local block="$1"

  case "$block" in
    01) echo "block-prod-01-ch_de-at-si-hr-hu.json" ;;
    02) echo "block-prod-02-rs-lv-pt-fr.json" ;;
    03) echo "block-prod-03-es-pl-bg.json" ;;
    04) echo "block-prod-04-de.json" ;;
    05) echo "block-prod-05-ro.json" ;;
    06) echo "block-prod-06-ua.json" ;;
    07) echo "block-prod-07-gb.json" ;;
    *) echo "" ;;
  esac
}

build_run_id() {
  local block="$1"
  local suffix="$RUN_SUFFIX"

  suffix="${suffix#-}"
  suffix="${suffix#_}"

  if [[ -n "$suffix" ]]; then
    echo "${RUN_PREFIX}-block-${block}-${suffix}"
    return
  fi

  echo "${RUN_PREFIX}-block-${block}"
}

validate_global_config() {
  local ok=0

  if [[ ! -x "$PHP_BIN" ]]; then
    echo "FEHLER: PHP_BIN nicht ausführbar: $PHP_BIN" >&2
    ok=1
  fi

  if [[ ! -d "$EXPORT_PATH" ]]; then
    echo "FEHLER: Exportpfad nicht gefunden: $EXPORT_PATH" >&2
    ok=1
  fi

  if [[ ! -d "$CONFIG_PATH" ]]; then
    echo "FEHLER: Config-Pfad nicht gefunden: $CONFIG_PATH" >&2
    ok=1
  fi

  if [[ ! -f "$REPO_ROOT/jobs/rehau_import_phase1.php" ]]; then
    echo "FEHLER: Job nicht gefunden: $REPO_ROOT/jobs/rehau_import_phase1.php" >&2
    ok=1
  fi

  if [[ "$REHAU_SOURCE_MANDANT_ID" =~ ^[0-9]+$ ]] && [[ "$REHAU_COPY_SOURCE_MANDANT_ID" =~ ^[0-9]+$ ]]; then
    :
  else
    echo "FEHLER: Mandanten-IDs müssen numerisch sein." >&2
    ok=1
  fi

  return $ok
}

test_block() {
  local block="$1"
  local config_file
  config_file="$(resolve_block_config "$block")"

  if [[ -z "$config_file" ]]; then
    echo "FEHLER: Unbekannter Block: $block" >&2
    return 1
  fi

  local config_path="$CONFIG_PATH/$config_file"
  local run_id
  run_id="$(build_run_id "$block")"

  if [[ ! -f "$config_path" ]]; then
    echo "FEHLER: Blockdefinition nicht gefunden: $config_path" >&2
    return 1
  fi

  echo "OK: Block $block"
  echo "  config: $config_path"
  echo "  run-id: $run_id"
  echo "  export: $EXPORT_PATH"
  echo "  db-host: ${DB_HOST:-<nicht gesetzt>}"
  echo "  runtime-context: ${REHAU_RUNTIME_CONTEXT:-<nicht gesetzt>}"
  echo "  run-suffix: ${RUN_SUFFIX:-<nicht gesetzt>}"
  echo "  memory-limit: $MEMORY_LIMIT"
  echo "  source-mandant: $REHAU_SOURCE_MANDANT_ID"
  echo "  copy-source-mandant: $REHAU_COPY_SOURCE_MANDANT_ID"
}

run_block() {
  local block="$1"
  local config_file
  config_file="$(resolve_block_config "$block")"

  if [[ -z "$config_file" ]]; then
    echo "Unbekannter Block: $block" >&2
    exit 1
  fi

  local config_path="$CONFIG_PATH/$config_file"
  local run_id
  run_id="$(build_run_id "$block")"

  if [[ ! -f "$config_path" ]]; then
    echo "Blockdefinition nicht gefunden: $config_path" >&2
    exit 1
  fi

  echo "### Starte Block $block mit $config_file"

  "$PHP_BIN" "$REPO_ROOT/jobs/rehau_import_phase1.php" \
    --export-path="$EXPORT_PATH" \
    --block-definition="$config_path" \
    --run-id="$run_id" \
    --execute-infrastructure=1 \
    --infrastructure-mode=prod \
    --memory-limit="$MEMORY_LIMIT" \
    --rehau-source-mandant-id="$REHAU_SOURCE_MANDANT_ID" \
    --rehau-copy-source-mandant-id="$REHAU_COPY_SOURCE_MANDANT_ID" \
    --create-dwh-mandant="$CREATE_DWH_MANDANT" \
    --provision-ansprechpartner-users="$PROVISION_ANSPRECHPARTNER_USERS" \
    --send-provisioning-mail="$SEND_PROVISIONING_MAIL"
}

args=()
for arg in "$@"; do
  case "$arg" in
    -h|--help)
      usage
      exit 0
      ;;
    --run-suffix=*)
      RUN_SUFFIX="${arg#--run-suffix=}"
      ;;
    --test)
      TEST_MODE=1
      ;;
    *)
      args+=("$arg")
      ;;
  esac
done

if [[ ${#args[@]} -eq 0 ]]; then
  args=(01 02 03 04 05 06 07)
fi

if ! validate_global_config; then
  exit 1
fi

if [[ "$TEST_MODE" -eq 1 ]]; then
  for block in "${args[@]}"; do
    test_block "$block"
  done
  exit 0
fi

for block in "${args[@]}"; do
  run_block "$block"
done