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

CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/solar-desktop"
ENV_FILE="${SOLAR_DESKTOP_ENV_FILE:-$CONFIG_DIR/solar-desktop.conf}"

if [[ -r "$ENV_FILE" ]]; then
  set -a
  # shellcheck disable=SC1090
  . "$ENV_FILE"
  set +a
fi

PORT="${DEVRA_BIND_PORT:-8765}"
HOST="${DEVRA_BIND_HOST:-127.0.0.1}"
PID_FILE="${XDG_RUNTIME_DIR:-/tmp}/solar-desktop-${USER}.pid"
GUI_PID_FILE="${XDG_RUNTIME_DIR:-/tmp}/solar-desktop-${USER}-gui.pid"
URL="http://${HOST}:${PORT}/api/desktop/shutdown"
HEALTH_URL="http://${HOST}:${PORT}/api/health"

request_shutdown() {
  if command -v curl >/dev/null 2>&1; then
    curl -fsS -X POST -H "Content-Type: application/json" -d '{}' "$URL" >/dev/null 2>&1
    return $?
  fi
  if command -v wget >/dev/null 2>&1; then
    wget -q --method=POST --header="Content-Type: application/json" --body-data='{}' -O /dev/null "$URL" >/dev/null 2>&1
    return $?
  fi
  return 1
}

health_ok() {
  if command -v curl >/dev/null 2>&1; then
    curl -fsS "$HEALTH_URL" >/dev/null 2>&1
    return $?
  fi
  if command -v wget >/dev/null 2>&1; then
    wget -q -O /dev/null "$HEALTH_URL" >/dev/null 2>&1
    return $?
  fi
  return 1
}

wait_for_shutdown() {
  local attempt
  for attempt in $(seq 1 25); do
    if ! health_ok; then
      return 0
    fi
    sleep 0.2
  done
  return 1
}

stop_gui() {
  local gui_pid
  [[ -s "$GUI_PID_FILE" ]] || return 0
  gui_pid="$(cat "$GUI_PID_FILE" 2>/dev/null || true)"
  if [[ "$gui_pid" =~ ^[0-9]+$ ]] && kill -0 "$gui_pid" >/dev/null 2>&1; then
    kill -TERM "$gui_pid" >/dev/null 2>&1 || true
  fi
  rm -f "$GUI_PID_FILE"
  if command -v pkill >/dev/null 2>&1; then
    pkill -u "$USER" -f '^/.*/solar-desktop-launcher(-4\.[01])?( --url .*)?$' >/dev/null 2>&1 || true
  fi
}

if request_shutdown; then
  if wait_for_shutdown; then
    rm -f "$PID_FILE"
    stop_gui
    echo "SolaR Desktop cerrado."
    exit 0
  fi
fi

if [[ -s "$PID_FILE" ]]; then
  pid="$(cat "$PID_FILE" 2>/dev/null || true)"
  if [[ "$pid" =~ ^[0-9]+$ ]] && kill -0 "$pid" >/dev/null 2>&1; then
    kill "$pid" >/dev/null 2>&1 || true
    for _ in $(seq 1 15); do
      kill -0 "$pid" >/dev/null 2>&1 || break
      sleep 0.2
    done
    kill -0 "$pid" >/dev/null 2>&1 && kill -TERM "$pid" >/dev/null 2>&1 || true
    rm -f "$PID_FILE"
    stop_gui
    echo "SolaR Desktop cerrado."
    exit 0
  fi
fi

if command -v pkill >/dev/null 2>&1; then
  pkill -u "$USER" -f "solar-workbench-backend" >/dev/null 2>&1 || true
fi
rm -f "$PID_FILE"
stop_gui
echo "SolaR Desktop cerrado."
