#!/usr/bin/env bash
# ============================================================
# VeedonAI Edge — سكربت تجهيز جهاز الفرع (Debian 12 / Ubuntu 24.04)
#
# الاستخدام على الجهاز:
#   curl -fsSL https://veedon.ai/dist/install.sh | sudo bash -s <DEVICE_TOKEN>
#
# يفعل: تثبيت Docker (إن لزم) → إنشاء /opt/veedonai → تنزيل الحزمة والوحدات
# من veedon.ai → كتابة .env → تشغيل VeedonAI (محرك + وكيل) → خدمة systemd
# + مؤقّت تحديث يومي يسحب أحدث الوحدات من نفس المجلد.
# ============================================================
set -euo pipefail

TOKEN="${1:-${VEEDON_DEVICE_TOKEN:-}}"
DIST_URL="${VEEDON_DIST_URL:-https://veedon.ai/dist}"
CLOUD_URL="${VEEDON_CLOUD_URL:-https://veedon.ai}"
DIR="${VEEDON_DIR:-/opt/veedonai}"

say() { echo -e "\033[1;36m[VeedonAI]\033[0m $*"; }
die() { echo -e "\033[1;31m[VeedonAI] خطأ:\033[0m $*" >&2; exit 1; }

[ -n "$TOKEN" ] || die "رمز الجهاز مطلوب: curl … | sudo bash -s <DEVICE_TOKEN>"

# 1) Docker (يُتخطّى إن كان موجوداً — مثل بيئة الاختبار)
if ! command -v docker >/dev/null 2>&1; then
  say "تثبيت Docker…"
  curl -fsSL https://get.docker.com | sh
  systemctl enable --now docker 2>/dev/null || true
else
  say "Docker موجود — تخطّي التثبيت"
fi
docker compose version >/dev/null 2>&1 || die "Docker Compose v2 غير متوفر"

# 2) مجلد العمل + الوحدات (يُنشأ عند كل تشغيل، idempotent)
say "تجهيز المجلد $DIR"
mkdir -p "$DIR"/{config,storage,models}

# 3) تنزيل الحزمة والوحدات من مجلد التوزيع (المصدر المركزي للتحديثات)
say "تنزيل الوحدات من $DIST_URL"
curl -fsSL "$DIST_URL/veedonai/docker-compose.yml" -o "$DIR/docker-compose.yml"
curl -fsSL "$DIST_URL/update.sh" -o "$DIR/update.sh" && chmod +x "$DIR/update.sh"
curl -fsSL "$DIST_URL/VERSION" -o "$DIR/VERSION" 2>/dev/null || echo "unknown" > "$DIR/VERSION"

# 4) بصمة العتاد — تُقرأ من مضيف الجهاز وقت التثبيت (أدق وأأمن من تركيب /sys)
hw() { cat "$1" 2>/dev/null | tr -d '\n' || true; }

# 4ب) المفتاح العام لتوقيع الموديولات (للتحقق من حزم VDE قبل تشغيلها — أمان)
PUBKEY=$(curl -fsSL "$CLOUD_URL/api/device/module_pubkey" 2>/dev/null \
  | sed -n 's/.*"public_key"[: ]*"\([^"]*\)".*/\1/p' || true)
[ -n "$PUBKEY" ] && say "مفتاح توقيع الموديولات مُزوّد" \
  || say "تحذير: تعذّر جلب مفتاح الموديولات (OTA للموديولات معطّل حتى يُزوّد)"

# 5) إعدادات الجهاز (.env)
cat > "$DIR/.env" <<EOF
VEEDON_CLOUD_URL=$CLOUD_URL
VEEDON_DEVICE_TOKEN=$TOKEN
VEEDON_DIST_URL=$DIST_URL
VEEDON_MQTT_HOST=mosquitto
VEEDON_MODULE_PUBKEY=$PUBKEY
# صور الإنتاج من سجل veedon.ai (تُتجاوز محلياً للاختبار)
VEEDON_ENGINE_IMAGE=${VEEDON_ENGINE_IMAGE:-registry.veedon.ai/veedonai/edge-engine:stable}
VEEDON_AGENT_IMAGE=${VEEDON_AGENT_IMAGE:-registry.veedon.ai/veedonai/edge-agent:stable}
# بصمة العتاد (product_uuid يربط بالّلوحة الفعلية — يمنع نسخ القرص لجهاز آخر)
VEEDON_HW_MACHINE_ID=$(hw /etc/machine-id)
VEEDON_HW_UUID=$(hw /sys/class/dmi/id/product_uuid)
VEEDON_HW_SERIAL=$(hw /sys/class/dmi/id/board_serial)
VEEDON_HW_PRODUCT_SERIAL=$(hw /sys/class/dmi/id/product_serial)
VEEDON_HW_VENDOR=$(hw /sys/class/dmi/id/sys_vendor)
VEEDON_HW_MODEL=$(hw /sys/class/dmi/id/product_name)
VEEDON_TUNNEL_URL=${TUNNEL_URL:-}
EOF

# 4د) نفق NAT (اختياري) — للوصول الحيّ لصفحات المحرك في فروع خلف NAT
#     يُفعَّل فقط إن زُوّد خادم frps (VEEDON_FRPS_ADDR + VEEDON_FRPS_TOKEN).
TUNNEL_PROFILE=""
if [ -n "${VEEDON_FRPS_ADDR:-}" ] && [ -n "${VEEDON_FRPS_TOKEN:-}" ]; then
  DEVICE=$(printf '%s' "$TOKEN" | sha256sum | cut -c1-12)
  say "تجهيز نفق NAT: $DEVICE.tunnel.veedon.ai"
  curl -fsSL "$DIST_URL/veedonai/frpc.toml.tmpl" -o "$DIR/frpc.toml.tmpl" 2>/dev/null || true
  if [ -f "$DIR/frpc.toml.tmpl" ]; then
    sed -e "s|__FRPS_ADDR__|${VEEDON_FRPS_ADDR}|" \
        -e "s|__FRPS_PORT__|${VEEDON_FRPS_PORT:-7000}|" \
        -e "s|__FRPS_TOKEN__|${VEEDON_FRPS_TOKEN}|" \
        -e "s|__DEVICE__|${DEVICE}|g" "$DIR/frpc.toml.tmpl" > "$DIR/frpc.toml"
    TUNNEL_PROFILE="--profile tunnel"
    sed -i "s|^VEEDON_TUNNEL_URL=.*|VEEDON_TUNNEL_URL=https://${DEVICE}.tunnel.veedon.ai|" "$DIR/.env"
  fi
fi

# 5) تشغيل VeedonAI (مع النفق إن فُعّل)
say "سحب وتشغيل VeedonAI…"
cd "$DIR"
docker compose $TUNNEL_PROFILE pull 2>/dev/null || say "تعذّر السحب (صور محلية؟) — متابعة"
docker compose $TUNNEL_PROFILE up -d

# 6) خدمة systemd + مؤقّت تحديث يومي (إن توفّر systemd)
if command -v systemctl >/dev/null 2>&1 && [ -d /etc/systemd/system ]; then
  say "تثبيت خدمة systemd + مؤقّت التحديث"
  cat > /etc/systemd/system/veedonai.service <<EOF
[Unit]
Description=VeedonAI Edge
Requires=docker.service
After=docker.service network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=$DIR
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
[Install]
WantedBy=multi-user.target
EOF
  cat > /etc/systemd/system/veedonai-update.service <<EOF
[Unit]
Description=VeedonAI update from $DIST_URL
[Service]
Type=oneshot
ExecStart=$DIR/update.sh
EOF
  cat > /etc/systemd/system/veedonai-update.timer <<EOF
[Unit]
Description=VeedonAI daily update
[Timer]
OnCalendar=*-*-* 04:30:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
  systemctl daemon-reload
  systemctl enable --now veedonai.service veedonai-update.timer 2>/dev/null || true
else
  say "لا systemd (بيئة اختبار) — تخطّي الخدمة"
fi

say "اكتمل التجهيز ✅  الجهاز سيظهر في لوحة veedon.ai بانتظار موافقتك."
