#!/usr/bin/env bash
# =============================================================================
# configure-network.sh
#
# One-command network bootstrap: selects the target network, funds the
# operator CLI wallet from the faucet, and patches all required .env values
# that depend on the operator's own IOTA address or generated secrets.
#
# Specifically:
#   1. Copies .env.<network> to .env (if .env does not already exist)
#   2. Switches the IOTA CLI to the target environment
#   3. Funds the operator wallet via the faucet
#   4. Reads `iota client active-address` → patches GUARDIAN_PAYMENT_RECIPIENT
#   5. Generates a fresh Ed25519 JWT signing key → patches
#      GUARDIAN_JWT_SIGNING_KEY_HEX (only if currently empty)
#
# Usage:
#   ./scripts/configure-network.sh --network testnet    # testnet (recommended)
#   ./scripts/configure-network.sh --network localnet   # localnet
#
# Prerequisites:
#   - IOTA CLI installed and on PATH
#   - For localnet: local node running (iota start --with-faucet)
# =============================================================================

set -euo pipefail

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

# ---------------------------------------------------------------------------
# Parse arguments
# ---------------------------------------------------------------------------

NETWORK=""

for arg in "$@"; do
  case $arg in
    --network)
      shift
      NETWORK="${1:-}"
      shift
      ;;
    --network=*)
      NETWORK="${arg#*=}"
      shift
      ;;
  esac
done

if [ -z "${NETWORK}" ]; then
  echo "Usage: $0 --network testnet|localnet"
  exit 1
fi

case "${NETWORK}" in
  testnet)
    IOTA_ENV_NAME="testnet"
    PRESET_FILE="${REPO_ROOT}/.env.testnet"
    ;;
  localnet)
    IOTA_ENV_NAME="localnet"
    PRESET_FILE="${REPO_ROOT}/.env.localnet"
    ;;
  *)
    echo "ERROR: Unknown network '${NETWORK}'. Use 'testnet' or 'localnet'."
    exit 1
    ;;
esac

ENV_FILE="${REPO_ROOT}/.env"

echo "==> Network: ${NETWORK}"
echo ""

# ---------------------------------------------------------------------------
# 1. Copy preset to .env if .env does not exist
# ---------------------------------------------------------------------------

if [ ! -f "${ENV_FILE}" ]; then
  if [ ! -f "${PRESET_FILE}" ]; then
    echo "ERROR: Preset file not found: ${PRESET_FILE}"
    exit 1
  fi
  cp "${PRESET_FILE}" "${ENV_FILE}"
  echo "    Created .env from ${PRESET_FILE##*/}"
else
  echo "    .env already exists — keeping existing values, patching only empty fields."
fi

# ---------------------------------------------------------------------------
# Helper: patch a key=value line in .env (only if currently empty)
# ---------------------------------------------------------------------------

patch_env_empty() {
  local key="$1"
  local value="$2"
  # Check if the key exists with an empty value
  if grep -q "^${key}=$" "${ENV_FILE}" 2>/dev/null; then
    if sed --version 2>/dev/null | grep -q GNU; then
      sed -i "s|^${key}=$|${key}=${value}|" "${ENV_FILE}"
    else
      sed -i '' "s|^${key}=$|${key}=${value}|" "${ENV_FILE}"
    fi
    return 0  # patched
  fi
  return 1  # already set or key not found
}

patch_env_force() {
  local key="$1"
  local value="$2"
  if grep -q "^${key}=" "${ENV_FILE}" 2>/dev/null; then
    if sed --version 2>/dev/null | grep -q GNU; then
      sed -i "s|^${key}=.*|${key}=${value}|" "${ENV_FILE}"
    else
      sed -i '' "s|^${key}=.*|${key}=${value}|" "${ENV_FILE}"
    fi
  else
    echo "" >> "${ENV_FILE}"
    echo "${key}=${value}" >> "${ENV_FILE}"
  fi
}

# ---------------------------------------------------------------------------
# 2. Switch IOTA CLI to target network
# ---------------------------------------------------------------------------

echo "==> Switching IOTA CLI to ${IOTA_ENV_NAME} ..."
iota client switch --env "${IOTA_ENV_NAME}" 2>/dev/null || true
echo "    OK"
echo ""

# ---------------------------------------------------------------------------
# 3. Fund the operator CLI wallet
# ---------------------------------------------------------------------------

echo "==> Funding operator CLI wallet from ${NETWORK} faucet ..."
if iota client faucet 2>&1 | sed 's/^/    /'; then
  echo "    OK (tokens may take up to 1 minute to arrive)"
else
  echo "    WARNING: faucet request may have failed — check balance with: iota client gas"
fi
echo ""

# ---------------------------------------------------------------------------
# 4. Derive GUARDIAN_PAYMENT_RECIPIENT from active address
# ---------------------------------------------------------------------------

echo "==> Reading active IOTA address ..."
ACTIVE_ADDR=$(iota client active-address 2>/dev/null | tr -d '[:space:]') || true

if [ -z "${ACTIVE_ADDR}" ]; then
  echo "    WARNING: Could not read active address — set GUARDIAN_PAYMENT_RECIPIENT manually."
else
  echo "    Active address: ${ACTIVE_ADDR}"
  if patch_env_empty "GUARDIAN_PAYMENT_RECIPIENT" "${ACTIVE_ADDR}"; then
    echo "    Patched GUARDIAN_PAYMENT_RECIPIENT=${ACTIVE_ADDR}"
  else
    CURRENT=$(grep "^GUARDIAN_PAYMENT_RECIPIENT=" "${ENV_FILE}" | cut -d= -f2-)
    if [ "${CURRENT}" = "${ACTIVE_ADDR}" ]; then
      echo "    GUARDIAN_PAYMENT_RECIPIENT already set to this address — no change."
    else
      echo "    GUARDIAN_PAYMENT_RECIPIENT already set to ${CURRENT} — keeping existing value."
      echo "    (To override, clear it in .env and re-run this script)"
    fi
  fi
fi
echo ""

# ---------------------------------------------------------------------------
# 5. Generate GUARDIAN_JWT_SIGNING_KEY_HEX if not set
# ---------------------------------------------------------------------------

echo "==> Checking GUARDIAN_JWT_SIGNING_KEY_HEX ..."
if grep -q "^GUARDIAN_JWT_SIGNING_KEY_HEX=$" "${ENV_FILE}" 2>/dev/null; then
  JWT_KEY=$(openssl rand -hex 32)
  patch_env_force "GUARDIAN_JWT_SIGNING_KEY_HEX" "${JWT_KEY}"
  echo "    Generated and patched GUARDIAN_JWT_SIGNING_KEY_HEX (32-byte random key)"
else
  echo "    Already set — no change."
fi
echo ""

# ---------------------------------------------------------------------------
# Done
# ---------------------------------------------------------------------------

echo "============================================================"
echo "  Network configured: ${NETWORK}"
echo ""
echo "  Next steps:"
echo "  1. Deploy the IOTA Identity Move package (auto-patches .env):"
if [ "${NETWORK}" = "testnet" ]; then
  echo "     ./scripts/deploy-identity-pkg.sh --network testnet"
else
  echo "     ./scripts/deploy-identity-pkg.sh"
fi
echo ""
echo "  2. Start all services:"
echo "     docker compose up --build -d"
echo ""
echo "  3. Fund all service wallets:"
echo "     ./scripts/fund-services.sh --network ${NETWORK}"
echo "============================================================"
