#!/usr/bin/env bash
set -euo pipefail

SKILL_NAME='flight-scout'
SITE_ORIGIN='https://www.izlx.de'
DEFAULT_BASE_URL='https://www.izlx.de'
DEFAULT_TIMEOUT='30'
SKILL_VERSION='79d5ac10f00b'

INSTALL_ROOT="skills"
BASE_URL="${FLIGHT_SCOUT_API_BASE_URL:-$DEFAULT_BASE_URL}"
API_KEY="${FLIGHT_SCOUT_API_KEY:-}"
TIMEOUT_SECONDS="${FLIGHT_SCOUT_API_TIMEOUT_SECONDS:-$DEFAULT_TIMEOUT}"
EXPLICIT_CONFIG=0
KEEP_EXISTING_ENV=0
NO_PROMPT=0
if [ -n "${FLIGHT_SCOUT_API_BASE_URL:-}" ] || [ -n "${FLIGHT_SCOUT_API_KEY:-}" ] || [ -n "${FLIGHT_SCOUT_API_TIMEOUT_SECONDS:-}" ]; then
  EXPLICIT_CONFIG=1
fi

print_help() {
  cat <<'EOF'
Flight Scout official installer

Usage:
  bash install.sh [--dir PATH] [--base-url URL] [--api-key KEY] [--timeout SECONDS] [--no-prompt]

Behavior:
  - Installs the skill if missing
  - Updates managed files if already installed
  - Preserves skills/flight-scout/.env by default
  - Prompts for a real API key only when needed
EOF
}

die() {
  echo "[flight-scout] $*" >&2
  exit 1
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
}

read_env_value() {
  python3 - "$1" "$2" <<'PY'
from pathlib import Path
import sys

path = Path(sys.argv[1])
key = sys.argv[2]
value = ""
if path.exists():
    for raw_line in path.read_text(encoding="utf-8").splitlines():
        line = raw_line.strip()
        if not line or line.startswith("#") or "=" not in line:
            continue
        current_key, current_value = line.split("=", 1)
        if current_key.strip() != key:
            continue
        current_value = current_value.strip()
        if len(current_value) >= 2 and current_value[0] == current_value[-1] and current_value[0] in ("'", '"'):
            current_value = current_value[1:-1]
        value = current_value
        break
print(value)
PY
}

is_placeholder_key() {
  case "$1" in
    ""|"fs_live_replace_me"|"fs_live_your_api_key"|"replace_me"|"your_api_key") return 0 ;;
    *) return 1 ;;
  esac
}

while [ "$#" -gt 0 ]; do
  case "$1" in
    --dir)
      INSTALL_ROOT="$2"
      shift 2
      ;;
    --base-url)
      BASE_URL="$2"
      EXPLICIT_CONFIG=1
      shift 2
      ;;
    --api-key)
      API_KEY="$2"
      EXPLICIT_CONFIG=1
      shift 2
      ;;
    --timeout)
      TIMEOUT_SECONDS="$2"
      EXPLICIT_CONFIG=1
      shift 2
      ;;
    --no-prompt)
      NO_PROMPT=1
      shift
      ;;
    --help|-h)
      print_help
      exit 0
      ;;
    *)
      die "unknown argument: $1"
      ;;
  esac
done

require_cmd curl
require_cmd tar
require_cmd python3

SKILL_DIR="$INSTALL_ROOT/$SKILL_NAME"
ENV_PATH="$SKILL_DIR/.env"
TMP_DIR="$(mktemp -d)"
ARCHIVE_PATH="$TMP_DIR/flight-scout-skill.tar.gz"
EXTRACT_ROOT="$TMP_DIR/extracted"
STAGED_DIR="$EXTRACT_ROOT/$SKILL_NAME"

cleanup() {
  rm -rf "$TMP_DIR"
}
trap cleanup EXIT

if [ -f "$ENV_PATH" ]; then
  EXISTING_BASE_URL="$(read_env_value "$ENV_PATH" FLIGHT_SCOUT_API_BASE_URL)"
  EXISTING_API_KEY="$(read_env_value "$ENV_PATH" FLIGHT_SCOUT_API_KEY)"
  EXISTING_TIMEOUT="$(read_env_value "$ENV_PATH" FLIGHT_SCOUT_API_TIMEOUT_SECONDS)"
  if [ -n "$EXISTING_BASE_URL" ] && [ "${FLIGHT_SCOUT_API_BASE_URL:-}" = "" ]; then
    BASE_URL="$EXISTING_BASE_URL"
  fi
  if [ -n "$EXISTING_TIMEOUT" ] && [ "${FLIGHT_SCOUT_API_TIMEOUT_SECONDS:-}" = "" ]; then
    TIMEOUT_SECONDS="$EXISTING_TIMEOUT"
  fi
  if [ -n "$EXISTING_API_KEY" ] && ! is_placeholder_key "$EXISTING_API_KEY" && [ "${FLIGHT_SCOUT_API_KEY:-}" = "" ]; then
    API_KEY="$EXISTING_API_KEY"
  fi
  if [ "$EXPLICIT_CONFIG" = "0" ] && [ -n "$EXISTING_BASE_URL" ] && [ -n "$EXISTING_TIMEOUT" ] && [ -n "$EXISTING_API_KEY" ] && ! is_placeholder_key "$EXISTING_API_KEY"; then
    KEEP_EXISTING_ENV=1
  fi
fi

if is_placeholder_key "$API_KEY"; then
  if [ "$NO_PROMPT" = "1" ]; then
    die "missing real FLIGHT_SCOUT_API_KEY and prompting is disabled"
  fi
  printf 'FLIGHT_SCOUT_API_KEY: ' >&2
  IFS= read -r API_KEY
  if is_placeholder_key "$API_KEY"; then
    die "a real FLIGHT_SCOUT_API_KEY is required"
  fi
fi

python3 - "$BASE_URL" "$TIMEOUT_SECONDS" <<'PY'
from urllib.parse import urlparse
import sys

base_url = sys.argv[1]
timeout_seconds = int(sys.argv[2])
parsed = urlparse(base_url)
if parsed.scheme not in ("http", "https") or not parsed.netloc:
    raise SystemExit("FLIGHT_SCOUT_API_BASE_URL must be a valid http(s) URL")
if timeout_seconds < 5 or timeout_seconds > 120:
    raise SystemExit("FLIGHT_SCOUT_API_TIMEOUT_SECONDS must be between 5 and 120")
PY

mkdir -p "$EXTRACT_ROOT"
PAYLOAD="$(python3 - "$BASE_URL" "$TIMEOUT_SECONDS" <<'PY'
import json
import sys
print(json.dumps({
    "base_url": sys.argv[1],
    "timeout_seconds": int(sys.argv[2]),
}, ensure_ascii=False))
PY
)"

curl -fsSL -X POST "$SITE_ORIGIN/skill/download" \
  -H 'Content-Type: application/json' \
  --data "$PAYLOAD" \
  -o "$ARCHIVE_PATH"

tar -xzf "$ARCHIVE_PATH" -C "$EXTRACT_ROOT"
[ -d "$STAGED_DIR" ] || die "downloaded archive did not contain $SKILL_NAME/"

mkdir -p "$SKILL_DIR"
rm -f "$SKILL_DIR/README.md" "$SKILL_DIR/.env.example" "$SKILL_DIR/SKILL.md"
rm -rf "$SKILL_DIR/agents" "$SKILL_DIR/references" "$SKILL_DIR/scripts"
cp "$STAGED_DIR/README.md" "$SKILL_DIR/README.md"
cp "$STAGED_DIR/.env.example" "$SKILL_DIR/.env.example"
cp "$STAGED_DIR/SKILL.md" "$SKILL_DIR/SKILL.md"
cp -R "$STAGED_DIR/agents" "$SKILL_DIR/agents"
cp -R "$STAGED_DIR/references" "$SKILL_DIR/references"
cp -R "$STAGED_DIR/scripts" "$SKILL_DIR/scripts"

if [ "$KEEP_EXISTING_ENV" != "1" ]; then
python3 - "$ENV_PATH" "$BASE_URL" "$API_KEY" "$TIMEOUT_SECONDS" <<'PY'
from pathlib import Path
import sys

env_path = Path(sys.argv[1])
base_url = sys.argv[2]
api_key = sys.argv[3]
timeout_seconds = sys.argv[4]
content = "\n".join([
    "# Generated by Flight Scout installer",
    f"FLIGHT_SCOUT_API_BASE_URL='{base_url}'",
    f"FLIGHT_SCOUT_API_KEY='{api_key}'",
    f"FLIGHT_SCOUT_API_TIMEOUT_SECONDS={timeout_seconds}",
])
env_path.write_text(content + "\n", encoding="utf-8")
PY
else
  echo "[flight-scout] keeping existing $ENV_PATH"
fi

python3 - "$SKILL_DIR/.flight-scout-version.json" "$SKILL_VERSION" "$SITE_ORIGIN" <<'PY'
from pathlib import Path
import json
import sys
from datetime import datetime, timezone

payload = {
    "skill_name": "flight-scout",
    "version": sys.argv[2],
    "installed_at": datetime.now(timezone.utc).isoformat(),
    "source": sys.argv[3],
}
Path(sys.argv[1]).write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
PY

python3 "$SKILL_DIR/scripts/call_api.py" --help >/dev/null

echo "[flight-scout] ready: $SKILL_DIR"
echo "[flight-scout] version: $SKILL_VERSION"
echo "[flight-scout] local config: $ENV_PATH"
echo "[flight-scout] re-run this installer to update managed files later"