#!/bin/bash
# PhoneForge Linux launcher — double-click or run ./PhoneForge (no manual Terminal steps).

set -euo pipefail

APP_ROOT="$(cd "$(dirname "$0")" && pwd)"
LOG_DIR="${HOME}/.local/share/PhoneForge/logs"
PID_FILE="${LOG_DIR}/server.pid"
MARKER="${APP_ROOT}/.pf_app_installed"
PORT=8742
URL="http://localhost:${PORT}/d"

mkdir -p "${LOG_DIR}"
cd "${APP_ROOT}"

notify() {
  if command -v notify-send >/dev/null 2>&1; then
    notify-send "PhoneForge" "$1"
  fi
}

alert() {
  if command -v zenity >/dev/null 2>&1; then
    zenity --error --title="PhoneForge" --text="$1" 2>/dev/null || true
  elif command -v kdialog >/dev/null 2>&1; then
    kdialog --error "$1" 2>/dev/null || true
  else
    notify "$1"
  fi
}

find_python() {
  if command -v python3 >/dev/null 2>&1; then
    command -v python3
    return 0
  fi
  return 1
}

PYTHON="$(find_python || true)"
if [ -z "${PYTHON}" ]; then
  alert "Python 3 is required. Install with: sudo apt install python3 python3-pip"
  exit 1
fi

port_open() {
  command -v lsof >/dev/null 2>&1 && lsof -ti ":${PORT}" >/dev/null 2>&1
}

stop_server() {
  if [ -f "${PID_FILE}" ]; then
    kill "$(cat "${PID_FILE}")" 2>/dev/null || true
    rm -f "${PID_FILE}"
  fi
  if port_open; then
    for pid in $(lsof -ti ":${PORT}" 2>/dev/null); do
      kill "${pid}" 2>/dev/null || true
    done
  fi
}

wait_for_server() {
  local i=0
  while [ "${i}" -lt 40 ]; do
    if port_open; then
      return 0
    fi
    sleep 0.25
    i=$((i + 1))
  done
  return 1
}

STARTED_BY_US=0

start_server() {
  if port_open; then
    return 0
  fi
  nohup "${PYTHON}" "${APP_ROOT}/server.py" >>"${LOG_DIR}/server.log" 2>&1 &
  echo $! >"${PID_FILE}"
  STARTED_BY_US=1
  wait_for_server
}

cleanup() {
  if [ "${STARTED_BY_US}" = "1" ]; then
    stop_server
  fi
}
trap cleanup EXIT INT TERM

if port_open; then
  xdg-open "${URL}" 2>/dev/null || sensible-browser "${URL}" 2>/dev/null || true
  exit 0
fi

if [ ! -f "${MARKER}" ]; then
  notify "First launch — installing dependencies (one time)…"
  if ! "${PYTHON}" "${APP_ROOT}/phoneforge.py" install >>"${LOG_DIR}/install.log" 2>&1; then
    alert "Install failed. See ${LOG_DIR}/install.log"
    exit 1
  fi
  touch "${MARKER}"
  notify "Install complete."
fi

if ! start_server; then
  alert "Could not start PhoneForge on port ${PORT}. See ${LOG_DIR}/server.log"
  exit 1
fi

xdg-open "${URL}" 2>/dev/null || sensible-browser "${URL}" 2>/dev/null || true
notify "Dashboard opened in your browser."

while port_open; do
  sleep 2
done