#!/bin/sh
set -eu

# TAURIN one-line installer.
#
# Usage after deploy:
#   curl -sfL https://your-server.example/taurin/install.sh | sh -
#
# Optional:
#   TAURIN_INSTALL_DIR=$HOME/.local/share/taurin
#   TAURIN_BRANCH=main
#   TAURIN_SKIP_SERVICE=true
#   TAURIN_SKIP_FREERDP=true
#   TAURIN_FORCE=true

TAURIN_INSTALL_DIR="${TAURIN_INSTALL_DIR:-$HOME/.local/share/taurin}"
TAURIN_SERVICE_NAME="${TAURIN_SERVICE_NAME:-taurin}"
TAURIN_BRANCH="${TAURIN_BRANCH:-main}"
TAURIN_DEFAULT_SOURCE_URL="https://taurin.pages.dev/taurin.tar.gz"
TAURIN_SOURCE_URL="${TAURIN_SOURCE_URL:-$TAURIN_DEFAULT_SOURCE_URL}"
TAURIN_GIT_URL="${TAURIN_GIT_URL:-}"
TAURIN_SKIP_SERVICE="${TAURIN_SKIP_SERVICE:-false}"
TAURIN_SKIP_FREERDP="${TAURIN_SKIP_FREERDP:-false}"
TAURIN_FORCE="${TAURIN_FORCE:-false}"

log() {
  printf '%s\n' "$*"
}

fail() {
  log "ERROR: $*" >&2
  exit 1
}

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || fail "Missing required command: $1"
}

as_root() {
  if [ "$(id -u)" -eq 0 ]; then
    "$@"
  elif command -v sudo >/dev/null 2>&1; then
    sudo "$@"
  else
    fail "Need root privileges. Install sudo or run as root."
  fi
}

install_system_packages() {
  if command -v apt-get >/dev/null 2>&1; then
    log "[1/6] Installing system packages with apt..."
    as_root apt-get update
    packages="python3 python3-venv python3-pip curl ca-certificates git unzip"
    if [ "$TAURIN_SKIP_FREERDP" != "true" ]; then
      packages="$packages freerdp3-x11"
    fi
    # shellcheck disable=SC2086
    as_root apt-get install -y $packages
    return
  fi

  fail "Unsupported OS package manager. This installer currently supports apt-based Ubuntu/Debian systems."
}

prepare_install_dir() {
  log "[2/6] Preparing install directory: $TAURIN_INSTALL_DIR"
  if [ -e "$TAURIN_INSTALL_DIR" ] && [ "$TAURIN_FORCE" != "true" ]; then
    fail "$TAURIN_INSTALL_DIR already exists. Set TAURIN_FORCE=true to replace it."
  fi

  if [ -e "$TAURIN_INSTALL_DIR" ]; then
    rm -rf "$TAURIN_INSTALL_DIR"
  fi

  mkdir -p "$TAURIN_INSTALL_DIR"
}

download_source() {
  log "[3/6] Downloading TAURIN source..."

  if [ -n "$TAURIN_SOURCE_URL" ]; then
    tmp_file="$(mktemp)"
    curl -fsSL "$TAURIN_SOURCE_URL" -o "$tmp_file"
    case "$TAURIN_SOURCE_URL" in
      *.tar.gz|*.tgz)
        tar -xzf "$tmp_file" -C "$TAURIN_INSTALL_DIR" --strip-components=1
        ;;
      *.zip)
        need_cmd unzip
        tmp_dir="$(mktemp -d)"
        unzip -q "$tmp_file" -d "$tmp_dir"
        first_dir="$(find "$tmp_dir" -mindepth 1 -maxdepth 1 -type d | head -n 1)"
        [ -n "$first_dir" ] || fail "Zip archive does not contain a project directory."
        cp -R "$first_dir"/. "$TAURIN_INSTALL_DIR"/
        rm -rf "$tmp_dir"
        ;;
      *)
        fail "Unsupported TAURIN_SOURCE_URL archive. Use .tar.gz, .tgz, or .zip."
        ;;
    esac
    rm -f "$tmp_file"
    return
  fi

  if [ -n "$TAURIN_GIT_URL" ]; then
    need_cmd git
    git clone --depth 1 --branch "$TAURIN_BRANCH" "$TAURIN_GIT_URL" "$TAURIN_INSTALL_DIR"
    return
  fi

  fail "Set TAURIN_SOURCE_URL or TAURIN_GIT_URL before running this installer."
}

setup_python() {
  log "[4/6] Setting up Python virtual environment..."
  cd "$TAURIN_INSTALL_DIR"
  python3 -m venv venv
  # shellcheck disable=SC1091
  . venv/bin/activate
  python -m pip install --upgrade pip
  pip install -r requirements.txt
}

bootstrap_config() {
  log "[5/6] Creating local config files..."
  cd "$TAURIN_INSTALL_DIR"
  sh scripts/bootstrap_config.sh
}

install_user_service() {
  if [ "$TAURIN_SKIP_SERVICE" = "true" ]; then
    log "[6/6] Skipping systemd user service."
    return
  fi

  if ! command -v systemctl >/dev/null 2>&1; then
    log "[6/6] systemctl not found. Skipping service install."
    return
  fi

  log "[6/6] Installing systemd user service..."
  service_dir="$HOME/.config/systemd/user"
  service_file="$service_dir/$TAURIN_SERVICE_NAME.service"
  mkdir -p "$service_dir"

  cat > "$service_file" <<EOF
[Unit]
Description=TAURIN Telegram AI Control Bot
After=graphical-session.target

[Service]
Type=simple
WorkingDirectory=$TAURIN_INSTALL_DIR
ExecStart=$TAURIN_INSTALL_DIR/venv/bin/python $TAURIN_INSTALL_DIR/main.py
Restart=always
RestartSec=5
Environment=DISPLAY=:0
Environment=XAUTHORITY=%h/.Xauthority

[Install]
WantedBy=default.target
EOF

  systemctl --user daemon-reload || true
  systemctl --user enable "$TAURIN_SERVICE_NAME" || true
}

print_next_steps() {
  cat <<EOF

TAURIN installed at:
  $TAURIN_INSTALL_DIR

Next steps:
  cd $TAURIN_INSTALL_DIR
  nano .env
  nano config.yaml

Run manually:
  source venv/bin/activate
  python main.py

Run as service:
  systemctl --user start $TAURIN_SERVICE_NAME
  systemctl --user status $TAURIN_SERVICE_NAME
  journalctl --user -u $TAURIN_SERVICE_NAME -f

Important:
  Set TELEGRAM_BOT_TOKEN and GROQ_API_KEY in .env.
  Set security.allowed_users in config.yaml.
EOF
}

main() {
  need_cmd curl
  need_cmd tar
  install_system_packages
  prepare_install_dir
  download_source
  setup_python
  bootstrap_config
  install_user_service
  print_next_steps
}

main "$@"
