#!/usr/bin/env bash
# epf.sh — обёртка над v8unpack для внешних обработок/отчётов 1С (.epf/.erf).
# Команды:
#   epf.sh unpack <file.epf> <dir>        распаковать в исходники
#   epf.sh pack   <dir> <file.epf>        собрать обратно
#   epf.sh roundtrip <dir> <out.epf>      собрать + распаковать обратно + diff -rq (ОБЯЗАТЕЛЬНО перед сдачей)
#   epf.sh ensure-tool                    проверить/поставить v8unpack
set -euo pipefail

ensure_tool() {
  if command -v v8unpack >/dev/null 2>&1; then return 0; fi
  if [ -x "$HOME/.local/bin/v8unpack" ]; then export PATH="$HOME/.local/bin:$PATH"; return 0; fi
  echo "v8unpack не найден — ставлю через pipx..." >&2
  command -v pipx >/dev/null 2>&1 || brew install pipx
  pipx install v8unpack
  export PATH="$HOME/.local/bin:$PATH"
}

V8() { ensure_tool; v8unpack "$@"; }

case "${1:-}" in
  ensure-tool) ensure_tool; v8unpack --version 2>&1 | head -1 || true ;;

  unpack)
    src="$2"; dst="$3"
    [ -f "$src" ] || { echo "нет файла: $src" >&2; exit 1; }
    rm -rf "$dst"; mkdir -p "$dst"
    V8 -E "$src" "$dst" >/dev/null 2>&1
    echo "распаковано → $dst"
    find "$dst" -type f | sed "s|$dst/||" | sort
    ;;

  pack)
    src="$2"; out="$3"
    [ -d "$src" ] || { echo "нет папки: $src" >&2; exit 1; }
    V8 -B "$src" "$out" >/dev/null 2>&1
    echo "собрано → $out ($(stat -f%z "$out" 2>/dev/null || stat -c%s "$out") байт)"
    ;;

  roundtrip)
    src="$2"; out="$3"
    [ -d "$src" ] || { echo "нет папки: $src" >&2; exit 1; }
    V8 -B "$src" "$out" >/dev/null 2>&1
    back="$(mktemp -d)/back"; mkdir -p "$back"
    V8 -E "$out" "$back" >/dev/null 2>&1
    echo "=== round-trip (исходники $src vs пересобранный, JSON — семантически) ==="
    # .json сравниваем по СОДЕРЖАНИЮ (v8unpack нормализует формат после Python-правки —
    # текстовый diff даёт ложную тревогу); остальные файлы — побайтно.
    python3 - "$src" "$back" <<'PYEOF'
import sys,os,json,filecmp
src,back=sys.argv[1],sys.argv[2]
bad=[]
for root,_,files in os.walk(src):
    for fn in files:
        a=os.path.join(root,fn); rel=os.path.relpath(a,src); b=os.path.join(back,rel)
        if not os.path.exists(b): bad.append(f"нет в пересобранном: {rel}"); continue
        if fn.endswith(".json"):
            try:
                if json.load(open(a,encoding="utf-8"))!=json.load(open(b,encoding="utf-8")):
                    bad.append(f"JSON-содержимое разошлось: {rel}")
            except Exception as e: bad.append(f"JSON-ошибка {rel}: {e}")
        else:
            if not filecmp.cmp(a,b,shallow=False): bad.append(f"бинарно разошлось: {rel}")
for r,_,fs in os.walk(back):
    for fn in fs:
        rel=os.path.relpath(os.path.join(r,fn),back)
        if not os.path.exists(os.path.join(src,rel)): bad.append(f"лишний в пересобранном: {rel}")
if bad:
    print("❌ round-trip разошёлся:"); [print("   "+x) for x in bad]; sys.exit(2)
print("✅ round-trip ЧИСТЫЙ (содержимое совпадает)")
PYEOF
    rc=$?
    [ $rc -eq 0 ] && echo "→ $out корректен ($(stat -f%z "$out" 2>/dev/null || stat -c%s "$out") байт)" || { echo "НЕ сдавать, разбираться" >&2; exit 2; }
    ;;

  *)
    sed -n '2,9p' "$0"; exit 1 ;;
esac
