#!/usr/bin/env bash
#
#  Pulse Chat — interaktivt installasjonsscript
#  ------------------------------------------------
#  Kjør én gang på en frisk server:
#      chmod +x install.sh && ./install.sh
#
#  Scriptet spør om noen få ting, og gjør resten automatisk:
#    • installerer avhengigheter (npm install)
#    • oppretter hovedadmin (brukernavn + passord)
#    • setter sidenavn + port
#    • genererer .env med en sterk SESSION_SECRET
#    • skriver settings.json (branding) og ecosystem.config.js
#    • starter appen med pm2 (hvis tilgjengelig), ellers gir startkommando
#
set -e

ROOT="$(cd "$(dirname "$0")" && pwd)"
cd "$ROOT"

echo ""
echo "=================================================="
echo "   PULSE CHAT  —  Installasjon"
echo "=================================================="
echo ""

# ── 1. Spørsmål ───────────────────────────────────────────────
read -rp "Sidenavn (vises overalt) [Pulse Chat]: " SITE_NAME
SITE_NAME="${SITE_NAME:-Pulse Chat}"

read -rp "Hovedadmin brukernavn [admin]: " ADMIN_USER
ADMIN_USER="${ADMIN_USER:-admin}"

while true; do
  read -rsp "Hovedadmin passord: " ADMIN_PASS; echo ""
  if [ -z "$ADMIN_PASS" ]; then echo "  Passord kan ikke være tomt."; continue; fi
  read -rsp "Gjenta passord: " ADMIN_PASS2; echo ""
  if [ "$ADMIN_PASS" != "$ADMIN_PASS2" ]; then echo "  Passordene er ikke like, prøv igjen."; continue; fi
  break
done

read -rp "Port [3000]: " PORT
PORT="${PORT:-3000}"

# pm2-appnavn avledet fra sidenavnet (små bokstaver, bindestrek)
PM2_NAME="$(echo "$SITE_NAME" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9' '-' | sed 's/^-//;s/-$//')"
PM2_NAME="${PM2_NAME:-pulse-chat}"

echo ""
echo "  Sidenavn : $SITE_NAME"
echo "  Admin    : $ADMIN_USER"
echo "  Port     : $PORT"
echo "  pm2-navn : $PM2_NAME"
echo ""
read -rp "Fortsette? [J/n]: " CONFIRM
case "$CONFIRM" in [nN]*) echo "Avbrutt."; exit 1;; esac

# ── 2. Avhengigheter ──────────────────────────────────────────
echo ""
echo "→ Installerer avhengigheter (npm install)…"
npm install --no-audit --no-fund

# ── 3. SESSION_SECRET ─────────────────────────────────────────
SECRET="$(node -e "console.log(require('crypto').randomBytes(48).toString('hex'))")"

# ── 4. .env ───────────────────────────────────────────────────
echo "→ Skriver .env…"
cat > .env <<EOF
PORT=$PORT
SESSION_SECRET=$SECRET
ADMIN_PASSWORD=$ADMIN_PASS
SITE_NAME=$SITE_NAME
EOF

# ── 5. Opprett hovedadmin i users.json ────────────────────────
echo "→ Oppretter hovedadmin…"
node -e "
const fs=require('fs'), bcrypt=require('bcryptjs');
const f='users.json';
let users=[]; try{users=JSON.parse(fs.readFileSync(f,'utf8'));}catch{}
const uname=process.argv[1], pass=process.argv[2];
users=users.filter(u=>u.username.toLowerCase()!==uname.toLowerCase());
const id=users.length?Math.max(...users.map(u=>u.id))+1:1;
users.push({id,username:uname,firstName:'',lastName:'',email:'',gender:'',passwordHash:bcrypt.hashSync(pass,10),role:'admin',createdAt:new Date().toISOString()});
fs.writeFileSync(f,JSON.stringify(users,null,2));
console.log('   admin \"'+uname+'\" opprettet.');
" "$ADMIN_USER" "$ADMIN_PASS"

# ── 6. settings.json (branding) ───────────────────────────────
echo "→ Skriver settings.json…"
node -e "
const fs=require('fs');
const f='settings.json';
let s={}; try{s=JSON.parse(fs.readFileSync(f,'utf8'));}catch{}
s.branding=Object.assign({}, s.branding||{}, { siteName: process.argv[1], tagline: process.argv[1] });
fs.writeFileSync(f,JSON.stringify(s,null,2));
" "$SITE_NAME"

# ── 7. ecosystem.config.js fra mal ────────────────────────────
echo "→ Genererer ecosystem.config.js…"
sed -e "s|__APP_NAME__|$PM2_NAME|g" \
    -e "s|__CWD__|$ROOT|g" \
    -e "s|__PORT__|$PORT|g" \
    -e "s|__SECRET__|$SECRET|g" \
    deploy/ecosystem.config.template.js > ecosystem.config.js

# ── 8. Start ──────────────────────────────────────────────────
echo ""
if command -v pm2 >/dev/null 2>&1; then
  echo "→ Starter med pm2…"
  pm2 start ecosystem.config.js --env production
  pm2 save
  echo ""
  echo "✔ Ferdig! $SITE_NAME kjører på port $PORT (pm2: $PM2_NAME)."
  echo "   Admin:  http://localhost:$PORT/admin"
else
  echo "pm2 er ikke installert. Du kan installere det med:  npm i -g pm2"
  echo "Eller starte direkte med:  PORT=$PORT node server.js"
  echo ""
  echo "✔ Konfigurasjon ferdig! $SITE_NAME er klar til å startes."
  echo "   Admin:  http://localhost:$PORT/admin"
fi
echo ""
