#!/usr/bin/env bash
# repo_builder.sh v1.0 — личный apt-репозиторий из отчёта soft_tracker
# Использование: DEPS=1 ./repo_builder.sh ~/soft-tracker/out/install-history.json ~/ubuntu-repo
set -euo pipefail
JSON="${1:-$HOME/soft-tracker/out/install-history.json}"
REPO="${2:-$HOME/ubuntu-repo}"
CODENAME=$(. /etc/os-release && echo "$VERSION_CODENAME")
NAS_TARGET="${NAS_TARGET:-root@NAS:/volume1/soft/ubuntu-repo}"   # ← поправь хост/IP NAS при необходимости

mkdir -p "$REPO/pool" "$REPO/dists/$CODENAME/main/binary-amd64"

# 1) Список пакетов из отчёта (apt + dpkg, без повторов, в порядке установки)
mapfile -t PKGS < <(python3 - "$JSON" <<'PY'
import json, sys
seen = []
for r in json.load(open(sys.argv[1])):
    if r['method'] in ('apt', 'dpkg') and r['package'] not in seen:
        seen.append(r['package'])
print('\n'.join(seen))
PY
)
echo "Пакетов в отчёте: ${#PKGS[@]}"

# 2) Замыкание зависимостей (DEPS=0 — только сами пакеты, без зависимостей)
if [ "${DEPS:-1}" = "1" ]; then
    : > "$REPO/closure.txt"
    for p in "${PKGS[@]}"; do
        apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts \
          --no-breaks --no-replaces --no-enhances "$p" 2>/dev/null \
          | grep -E '^[a-z0-9][a-z0-9.+-]*$' >> "$REPO/closure.txt" || true
    done
    sort -u "$REPO/closure.txt" -o "$REPO/closure.txt"
else
    printf '%s\n' "${PKGS[@]}" | sort -u > "$REPO/closure.txt"
fi
echo "Замыкание с зависимостями: $(wc -l < "$REPO/closure.txt") пакетов"

# 3) Скачивание .deb в pool/
cd "$REPO/pool"
: > ../missing.txt
while read -r p; do
    apt-get download "$p" >/dev/null 2>&1 || echo "$p" >> ../missing.txt
done < ../closure.txt
echo "Скачано .deb: $(ls -1 *.deb 2>/dev/null | wc -l); недоступно: $(wc -l < ../missing.txt)"

# 4) Индексы репозитория
cd "$REPO"
apt-ftparchive packages pool/ > "dists/$CODENAME/main/binary-amd64/Packages"
gzip -kf9 "dists/$CODENAME/main/binary-amd64/Packages"
apt-ftparchive \
  -o APT::FTPArchive::Release::Origin=Nikita-Repo \
  -o APT::FTPArchive::Release::Label=Nikita-Repo \
  -o APT::FTPArchive::Release::Suite="$CODENAME" \
  -o APT::FTPArchive::Release::Codename="$CODENAME" \
  -o APT::FTPArchive::Release::Components=main \
  release "dists/$CODENAME" > "dists/$CODENAME/Release"

# 5) Публикация на NAS
if command -v rsync >/dev/null; then
    rsync -av --delete "$REPO/" "$NAS_TARGET/"
else
    scp -r "$REPO/" "$NAS_TARGET/"
fi

echo
echo "✅ Готово. Строка для /etc/apt/sources.list.d/nikita-repo.list:"
echo "deb [trusted=yes] https://a2.njbest.ru/ubuntu-repo/ $CODENAME main"