#!/usr/bin/env bash
set -euo pipefail

###############################################################################
# 0. Preconditions: must be root
###############################################################################
if [[ $EUID -ne 0 ]]; then
  echo "Error: this script must be run as root" >&2
  exit 1
fi

###############################################################################
# 1. One‑time Docker install (APT, rootful) – optional prompt
###############################################################################
read -rp "Run one‑time Docker installation? [y/N]: " ans
if [[ $ans =~ ^[Yy]$ ]]; then
  apt-get update
  apt-get install -y ca-certificates curl gnupg

  install -m 0755 -d /etc/apt/keyrings
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
    -o /etc/apt/keyrings/docker.asc
  chmod a+r /etc/apt/keyrings/docker.asc

  echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
     https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo ${UBUNTU_CODENAME:-$VERSION_CODENAME}) stable" \
    > /etc/apt/sources.list.d/docker.list

  apt-get update
  apt-get install -y docker-ce docker-ce-cli containerd.io \
                     docker-buildx-plugin docker-compose-plugin

  docker run --rm hello-world
fi

###############################################################################
# 2. Paths, users, permissions
###############################################################################
NAS_BASE="/var/containers"
DOCKER_USER="docker"
DOCKER_GROUP="docker"

mkdir -p "$NAS_BASE"/{ollama,sd,comfy}

if ! id "$DOCKER_USER" &>/dev/null; then
  groupadd --system "$DOCKER_GROUP"
  useradd  --system --no-create-home --shell /usr/sbin/nologin \
           --gid "$DOCKER_GROUP" "$DOCKER_USER"
fi

USER_ID=$(id -u "$DOCKER_USER")
GROUP_ID=$(getent group "$DOCKER_GROUP" | cut -d: -f3)

chown -R "$USER_ID:$GROUP_ID" "$NAS_BASE"
chmod -R g+rwX "$NAS_BASE"

###############################################################################
# 3. Generic idempotent helper
###############################################################################
create_or_start() {
  local name="$1"; shift

  # Already RUNNING → skip
  if docker ps   --filter "name=^${name}\$" --format '{{.Names}}' | grep -q "^${name}\$"; then
    echo "✅ $name is already running – skipped."
    return
  fi

  # Exists but STOPPED → start
  if docker ps -a --filter "name=^${name}\$" --format '{{.Names}}' | grep -q "^${name}\$"; then
    echo "🔄 Starting $name"
    docker start "$name"
    return
  fi

  # Create & run
  echo "🚀 Creating $name"
  docker run -d \
    --name "$name" \
    --network bridge \
    --restart unless-stopped \
    "$@"
}

###############################################################################
# 4. Container deployments
###############################################################################

### 4.1 Portainer UI ----------------------------------------------------------
docker volume create portainer_data >/dev/null
create_or_start portainer \
  -p 9443:9443 \
  -p 8000:8000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts

### 4.2 OpenWebUI -------------------------------------------------------------
create_or_start openwebui \
  -p 3000:8080 \
  -e OLLAMA_BASE_URL=http://docker-ai:11434 \
 ghcr.io/open-webui/open-webui:latest

### 4.3 Dashy -----------------------------------------------------------------
DASHY_CONF="/home/USERNAME/docker/dashy/public/conf.yml"
DASHY_ICONS="/home/USERNAME/docker/dashy/icons"
mkdir -p "$(dirname "$DASHY_CONF")" "$DASHY_ICONS"

create_or_start dashy \
  -p 8088:8080 \
  -v "$DASHY_CONF:/app/public/conf.yml" \
  -v "$DASHY_ICONS:/app/public/item-icons/icons" \
  lissy93/dashy:latest

### 4.4 Jellyfin --------------------------------------------------------------
HOST_CONFIG_DIR="/srv/jellyfin/config"
HOST_CACHE_DIR="/srv/jellyfin/cache"
HOST_MEDIA_DIR="/var/nas/Library/Entertainment"
mkdir -p "$HOST_CONFIG_DIR" "$HOST_CACHE_DIR"

create_or_start jellyfin \
  -p 8096:8096 \
  -p 8920:8920 \
  --user "$USER_ID:$GROUP_ID" \
  -v "$HOST_CONFIG_DIR:/config" \
  -v "$HOST_CACHE_DIR:/cache" \
  -v "$HOST_MEDIA_DIR:/media" \
  --group-add 1001 \
  jellyfin/jellyfin:latest

###############################################################################
# 5. Friendly summary
###############################################################################
cat <<EOF

Access URLs
-----------
• Portainer UI : https://<host>:9443
• OpenWebUI    : http://<host>:3000
• Dashy        : http://<host>:8088
• Jellyfin     : http://<host>:8096  (host network)
EOF
