#!/usr/bin/env bash
# Probe installed provider CLIs and write auth status under /var/lib/axiowl/providers/
set -euo pipefail

LOG="/tmp/axiowl-discover.log"
exec >>"$LOG" 2>&1
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] axiowl-discover start"

if [[ -n "${AXIOWL_INSTALLER_ROOT:-}" ]]; then
  INSTALLER="${AXIOWL_INSTALLER_ROOT}"
elif [[ -d /opt/axiowl/repo/apps/linux-desktop/installer ]]; then
  INSTALLER="/opt/axiowl/repo/apps/linux-desktop/installer"
else
  INSTALLER="/usr/share/axiowl"
fi
# shellcheck source=../lib/provider-resolve.sh
source "${INSTALLER}/lib/provider-resolve.sh"

PROVIDERS_ROOT="${AXIOWL_PROVIDERS_ROOT:-/var/lib/axiowl/providers}"
DESKTOP_HOME="$(provider_user_home)"
DISCOVER_PATH="$(provider_discover_path)"

mkdir -p "$PROVIDERS_ROOT"
chmod 755 /var/lib/axiowl "$PROVIDERS_ROOT" 2>/dev/null || true

# One-time state migration from the old GUI alias to the package/provider id.
if [[ -d "${PROVIDERS_ROOT}/vscode" && ! -e "${PROVIDERS_ROOT}/vscode_copilot_backed" ]]; then
  mv "${PROVIDERS_ROOT}/vscode" "${PROVIDERS_ROOT}/vscode_copilot_backed"
fi

echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] discover user=${AXIOWL_DESKTOP_USER} path=${DISCOVER_PATH}"

write_provider_json() {
  local id="$1"
  local installed="$2"
  local authenticated="$3"
  local binary="${4:-}"
  local dir="${PROVIDERS_ROOT}/${id}"
  mkdir -p "$dir"
  python3 - "$dir/provider.json" "$id" "$installed" "$authenticated" "$binary" <<'PY'
import json, os, sys
from datetime import datetime, timezone

path, provider_id, installed_s, auth_s, binary = sys.argv[1:6]
installed = installed_s == "true"
authenticated = auth_s == "true"

if os.path.exists(path):
    data = json.load(open(path, encoding="utf-8"))
else:
    data = {
        "id": provider_id,
        "installed": False,
        "authenticated": False,
        "mcp_configured": False,
        "extension_installed": False,
    }

data["id"] = provider_id
data["installed"] = installed
data["authenticated"] = authenticated
components = data.setdefault("components", {})
components["provider"] = {
    "state": "installed" if installed else "not_installed",
    "surface": "cli" if installed else "cli",
}
if binary:
    data["binary"] = binary
elif not installed:
    data.pop("binary", None)

if not installed:
    data["mcp_configured"] = False
    data["extension_installed"] = False

data["updated_at"] = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
    json.dump(data, f, indent=2)
    f.write("\n")
PY
}

probe_codex() {
  local bin
  bin="$(resolve_provider_bin codex || true)"
  if [[ -z "$bin" ]]; then
    write_provider_json codex false false ""
    echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] codex binary missing; skipping auth probe"
    return 0
  fi
  local auth=false
  if sudo -u "$AXIOWL_DESKTOP_USER" env PATH="$DISCOVER_PATH" HOME="$DESKTOP_HOME" codex login status >/dev/null 2>&1; then
    auth=true
  fi
  write_provider_json codex true "$auth" "$bin"
  echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] codex probe installed=true authenticated=${auth} binary=${bin}"
}

probe_named() {
  local id="$1"
  local bin_name="$2"
  local bin
  bin="$(resolve_provider_bin "$bin_name" || true)"
  if [[ -z "$bin" && "$id" == "gemini" ]]; then
    bin="$(resolve_provider_bin agy || true)"
  fi
  if [[ -z "$bin" ]]; then
    write_provider_json "$id" false false ""
    echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] ${id} binary missing; skipping auth probe"
    return 0
  fi
  write_provider_json "$id" true false "$bin"
  echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] ${id} probe installed=true binary=${bin} (auth not verified in v1)"
}

probe_codex
probe_named cursor cursor
probe_named vscode_copilot_backed code
probe_named opencode opencode
probe_named claude claude
probe_named gemini gemini
probe_named copilot copilot

find "$PROVIDERS_ROOT" -type f -name provider.json -exec chmod 644 {} + 2>/dev/null || true
chmod 755 "$PROVIDERS_ROOT" /var/lib/axiowl 2>/dev/null || true

echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] axiowl-discover done"
