#!/usr/bin/env bash
# ============================================================
# VeedonAI Edge — تحضير وتقوية نظام Debian 12 من الصفر
# (يعمل أيضاً على Ubuntu Server 24.04 — عائلة Debian)
#
# يُشغّل مرة واحدة على نظام نظيف قبل install.sh. آمن لإعادة التشغيل (idempotent).
#
#   curl -fsSL https://veedon.ai/dist/prepare-debian.sh | sudo bash
#   # أو مع مفتاح SSH للأدمن وتثبيت مباشر:
#   VEEDON_SSH_KEY="ssh-ed25519 AAAA…" VEEDON_TOKEN="<TOKEN>" \
#     bash prepare-debian.sh
#
# متغيّرات اختيارية:
#   VEEDON_USER      اسم مستخدم الخدمة (افتراضي veedon)
#   VEEDON_SSH_KEY   مفتاح الأدمن العام — عند تمريره يُقفل SSH على المفاتيح فقط
#   VEEDON_SSH_PORT  منفذ SSH (افتراضي 22)
#   VEEDON_HOSTNAME  اسم الجهاز (افتراضي veedon-edge)
#   VEEDON_TOKEN     رمز الجهاز — عند تمريره يُشغّل install.sh تلقائياً بعد التقوية
# ============================================================
set -euo pipefail

USER_NAME="${VEEDON_USER:-veedon}"
SSH_PORT="${VEEDON_SSH_PORT:-22}"
HOSTNAME_NEW="${VEEDON_HOSTNAME:-veedon-edge}"
SSH_KEY="${VEEDON_SSH_KEY:-}"
TOKEN="${VEEDON_TOKEN:-}"
DIST_URL="${VEEDON_DIST_URL:-https://veedon.ai/dist}"

say()  { echo -e "\033[1;36m[VeedonAI-prep]\033[0m $*"; }
warn() { echo -e "\033[1;33m[VeedonAI-prep] تنبيه:\033[0m $*"; }
die()  { echo -e "\033[1;31m[VeedonAI-prep] خطأ:\033[0m $*" >&2; exit 1; }
has_systemd() { command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ]; }

[ "$(id -u)" = "0" ] || die "شغّل كـ root (sudo)."
export DEBIAN_FRONTEND=noninteractive

# ── 1) تحديث النظام + الأساسيات ──────────────────────────────
say "تحديث النظام وتثبيت الأساسيات…"
apt-get update -qq
apt-get -y -qq upgrade
apt-get install -y -qq \
  ca-certificates curl gnupg ufw fail2ban unattended-upgrades \
  chrony jq htop nano tzdata

# ── 2) الوقت والمنطقة (حاسم لتوقيت الأحداث وTLS) ─────────────
timedatectl set-timezone Asia/Riyadh 2>/dev/null || true
if has_systemd; then systemctl enable --now chrony 2>/dev/null || true; fi

# ── 3) اسم الجهاز ───────────────────────────────────────────
hostnamectl set-hostname "$HOSTNAME_NEW" 2>/dev/null || echo "$HOSTNAME_NEW" > /etc/hostname
grep -q "$HOSTNAME_NEW" /etc/hosts || echo "127.0.1.1 $HOSTNAME_NEW" >> /etc/hosts

# ── 4) مستخدم خدمة غير root (مع صلاحية Docker وsudo) ─────────
if ! id "$USER_NAME" >/dev/null 2>&1; then
  say "إنشاء مستخدم الخدمة $USER_NAME"
  useradd -m -s /bin/bash "$USER_NAME"
  usermod -aG sudo "$USER_NAME"
fi
getent group docker >/dev/null || groupadd docker
usermod -aG docker "$USER_NAME"
if [ -n "$SSH_KEY" ]; then
  install -d -m700 -o "$USER_NAME" -g "$USER_NAME" "/home/$USER_NAME/.ssh"
  echo "$SSH_KEY" > "/home/$USER_NAME/.ssh/authorized_keys"
  chmod 600 "/home/$USER_NAME/.ssh/authorized_keys"
  chown "$USER_NAME:$USER_NAME" "/home/$USER_NAME/.ssh/authorized_keys"
fi

# ── 5) تقوية SSH ────────────────────────────────────────────
say "تقوية SSH (منفذ $SSH_PORT)…"
mkdir -p /etc/ssh/sshd_config.d
{
  echo "Port $SSH_PORT"
  echo "PermitRootLogin no"
  echo "X11Forwarding no"
  echo "MaxAuthTries 3"
  echo "ClientAliveInterval 300"
  echo "AllowUsers $USER_NAME"
  # قفل كلمات المرور فقط إذا سُلّم مفتاح الأدمن (تجنّب قفل النفس)
  if [ -n "$SSH_KEY" ]; then
    echo "PasswordAuthentication no"
    echo "PubkeyAuthentication yes"
  fi
} > /etc/ssh/sshd_config.d/99-veedon.conf
if [ -z "$SSH_KEY" ]; then
  warn "لم يُمرّر VEEDON_SSH_KEY — تُركت مصادقة كلمة المرور مفعّلة لتجنّب قفلك خارجاً."
fi
if has_systemd; then systemctl reload ssh 2>/dev/null || systemctl reload sshd 2>/dev/null || true; fi

# ── 6) جدار ناري (appliance: صادر مسموح، وارد مرفوض عدا SSH) ─
say "ضبط الجدار الناري…"
if ufw --force reset >/dev/null 2>&1; then
  ufw default deny incoming  >/dev/null 2>&1 || true
  ufw default allow outgoing >/dev/null 2>&1 || true   # الصادر: veedon.ai + RTSP للكاميرات
  ufw limit "$SSH_PORT"/tcp  >/dev/null 2>&1 || true    # SSH مع تحديد المعدّل ضد التخمين
  ufw --force enable         >/dev/null 2>&1 || warn "ufw لم يُفعّل (بيئة بلا كيرنل؟)"
else
  warn "ufw غير متاح في هذه البيئة — يُطبّق على العتاد الحقيقي."
fi

# ── 7) fail2ban لحماية SSH ──────────────────────────────────
cat > /etc/fail2ban/jail.d/veedon.conf <<EOF
[sshd]
enabled = true
port    = $SSH_PORT
maxretry = 4
bantime  = 1h
findtime = 10m
EOF
if has_systemd; then systemctl enable --now fail2ban 2>/dev/null || true; fi

# ── 8) تحديثات أمنية تلقائية ────────────────────────────────
say "تفعيل التحديثات الأمنية التلقائية…"
cat > /etc/apt/apt.conf.d/20auto-upgrades <<EOF
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
EOF
cat > /etc/apt/apt.conf.d/51veedon-unattended <<EOF
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
EOF
if has_systemd; then systemctl enable --now unattended-upgrades 2>/dev/null || true; fi

# ── 9) تقوية النواة (sysctl) — آمنة مع Docker ──────────────
# ملاحظة: لا نلمس ip_forward (يحتاجه Docker) — Docker يضبطه بنفسه.
cat > /etc/sysctl.d/99-veedon.conf <<'EOF'
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
EOF
sysctl --system >/dev/null 2>&1 || warn "sysctl لم يُطبّق (بيئة بلا كيرنل؟)"

# ── 10) حدّ سجلّات journald (إطالة عمر eMMC/SD على Mini PC) ──
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-veedon.conf <<EOF
[Journal]
SystemMaxUse=200M
MaxRetentionSec=14day
EOF
if has_systemd; then systemctl restart systemd-journald 2>/dev/null || true; fi

# ── 11) إيقاف خدمات غير لازمة على appliance ────────────────
for svc in bluetooth cups avahi-daemon ModemManager; do
  if has_systemd; then systemctl disable --now "$svc" 2>/dev/null || true; fi
done

say "اكتملت تقوية النظام ✅  (المستخدم: $USER_NAME، المنفذ: $SSH_PORT، الجدار مفعّل)"

# ── 12) تثبيت VeedonAI تلقائياً إن مُرّر الرمز ──────────────
if [ -n "$TOKEN" ]; then
  say "تشغيل تثبيت VeedonAI…"
  curl -fsSL "$DIST_URL/install.sh" -o /tmp/veedon-install.sh
  VEEDON_DIST_URL="$DIST_URL" bash /tmp/veedon-install.sh "$TOKEN"
else
  say "الخطوة التالية: curl -fsSL $DIST_URL/install.sh | sudo bash -s <DEVICE_TOKEN>"
fi
