#!/usr/bin/env bash
# =============================================
#  MinusNow ITSM -- Linux Installer v2.5
#  February 2026
# =============================================
# Validates prerequisites, sets up PostgreSQL (with schema permissions),
# installs dependencies, builds, pushes DB schema, and optionally
# registers a systemd service.
#
# Usage:
#   sudo ./install-linux.sh [INSTALL_DIR] [SERVICE_NAME]
#   sudo ./install-linux.sh /opt/minusnow minusnow
#   ./install-linux.sh                     # current dir, no service

set -euo pipefail

INSTALL_DIR="${1:-$(pwd)}"
SERVICE_NAME="${2:-}"
PG_USER="${PG_USER:-minusnow_user}"
PG_DATABASE="${PG_DATABASE:-minusnow}"
PORT="${PORT:-5000}"

step()  { echo -e "\n\033[36m==> $1\033[0m"; }
ok()    { echo -e "    \033[32m[OK]\033[0m $1"; }
warn()  { echo -e "    \033[33m[WARN]\033[0m $1"; }
fail()  { echo -e "    \033[31m[FAIL]\033[0m $1"; }

echo ""
echo "  ============================================="
echo "   MinusNow ITSM -- Linux Installer v2.5"
echo "   February 2026"
echo "  ============================================="
echo ""

# --- 1. Prerequisites ---
step "Checking prerequisites"

if ! command -v node >/dev/null 2>&1; then
  fail "Node.js not found. Install Node.js 20 LTS:"
  echo "    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -"
  echo "    sudo apt install -y nodejs"
  exit 1
fi
ok "Node.js $(node --version)"

if ! command -v npm >/dev/null 2>&1; then
  fail "npm not found."
  exit 1
fi
ok "npm $(npm --version)"

if ! command -v psql >/dev/null 2>&1; then
  fail "psql not found. Install PostgreSQL 15+:"
  echo "    sudo apt install -y postgresql postgresql-contrib"
  exit 1
fi
ok "PostgreSQL $(psql --version | grep -oP '\d+\.\d+')"

# --- 2. Install Directory ---
step "Preparing install directory: $INSTALL_DIR"
mkdir -p "$INSTALL_DIR"

SRC_DIR=$(pwd)
if [ "$SRC_DIR" != "$INSTALL_DIR" ]; then
  echo "    Copying files to $INSTALL_DIR..."
  rsync -a --delete --exclude=node_modules --exclude=dist --exclude=.git "$SRC_DIR/" "$INSTALL_DIR/"
fi
cd "$INSTALL_DIR"

# --- 3. Database Setup ---
if [ -z "${SKIP_DB_SETUP:-}" ]; then
  step "Setting up PostgreSQL database"

  if [ -z "${PG_PASSWORD:-}" ]; then
    read -sp "Enter password for PostgreSQL user '$PG_USER': " PG_PASSWORD
    echo ""
  fi

  echo "    Creating database '$PG_DATABASE' and user '$PG_USER'..."
  sudo -u postgres psql -c "DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname='$PG_USER') THEN CREATE USER $PG_USER WITH ENCRYPTED PASSWORD '$PG_PASSWORD'; END IF; END \$\$;" 2>/dev/null || true
  sudo -u postgres psql -c "SELECT 'CREATE DATABASE $PG_DATABASE OWNER $PG_USER' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname='$PG_DATABASE')\gexec" 2>/dev/null || true
  sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $PG_DATABASE TO $PG_USER;" 2>/dev/null || true
  sudo -u postgres psql -c "ALTER DATABASE $PG_DATABASE OWNER TO $PG_USER;" 2>/dev/null || true

  # Grant schema permissions (PostgreSQL 15+ requirement)
  echo "    Granting schema permissions (PostgreSQL 15+ requirement)..."
  sudo -u postgres psql -d "$PG_DATABASE" -c "GRANT ALL ON SCHEMA public TO $PG_USER; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO $PG_USER; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO $PG_USER; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO $PG_USER; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO $PG_USER;" 2>/dev/null || true
  ok "Database ready with schema permissions granted"
fi

# --- 4. Create .env ---
step "Configuring environment"
if [ ! -f .env ]; then
  SESSION_SECRET=$(openssl rand -base64 32)
  cat > .env <<EOF
DATABASE_URL=postgresql://${PG_USER}:${PG_PASSWORD}@localhost:5432/${PG_DATABASE}
SESSION_SECRET=${SESSION_SECRET}
PORT=${PORT}
NODE_ENV=development
EOF
  chmod 600 .env
  ok "Created .env with auto-generated SESSION_SECRET"
else
  ok ".env already exists -- skipping"
fi

# --- 5. Install Dependencies ---
step "Installing dependencies"
# Remove stale global drizzle-kit
if npm list -g drizzle-kit 2>/dev/null | grep -q drizzle-kit; then
  warn "Removing old global drizzle-kit..."
  sudo npm uninstall -g drizzle-kit 2>/dev/null || true
fi
npm install
ok "Dependencies installed"

# --- 6. Push Database Schema ---
step "Pushing database schema"
npm run db:push
ok "Database schema pushed"

# --- 7. Build ---
step "Building application"
npm run build
ok "Build complete"

# --- 8. Systemd Service ---
if [ -n "$SERVICE_NAME" ]; then
  step "Creating systemd service: $SERVICE_NAME"
  SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
  cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=MinusNow ITSM Platform
After=network.target postgresql.service

[Service]
Type=simple
WorkingDirectory=$INSTALL_DIR
ExecStart=/usr/bin/node $INSTALL_DIR/dist/index.cjs
Restart=always
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=$PORT
EnvironmentFile=$INSTALL_DIR/.env

[Install]
WantedBy=multi-user.target
EOF
  systemctl daemon-reload
  systemctl enable --now "$SERVICE_NAME"
  ok "Service enabled and started"
fi

echo ""
echo "  ============================================="
echo "   Installation Complete!"
echo "   Start:  npm run start"
echo "   Dev:    npm run dev"
echo "   URL:    http://localhost:$PORT"
echo "  ============================================="
echo ""
