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

id="${1:-}"
if [[ ! "$id" =~ ^[a-z][a-z0-9._-]*$ ]]; then
  echo "extension id must match ^[a-z][a-z0-9._-]*$" >&2
  exit 2
fi

root="$(cd "$(dirname "$0")/.." && pwd)"
source="$root/extensions/$id"
output="$root/packages/$id.eleextension"
if [[ ! -d "$source" ]]; then
  echo "extension does not exist: $id" >&2
  exit 1
fi

mkdir -p "$root/packages"
python3 - "$source" "$output" <<'PY'
import json
import os
import sys
import zipfile
from pathlib import Path

source = Path(sys.argv[1]).resolve()
output = Path(sys.argv[2]).resolve()
manifest_path = source / "manifest.json"
if not manifest_path.is_file():
    raise SystemExit(f"missing manifest: {manifest_path}")
manifest = json.loads(manifest_path.read_text())
if manifest.get("id") != source.name:
    raise SystemExit("manifest id must match extension directory")

files = sorted(p for p in source.rglob("*") if p.is_file())
if any(p.is_symlink() for p in files):
    raise SystemExit("symlinks are not allowed in extension packages")
tmp = output.with_suffix(output.suffix + ".tmp")
try:
    with zipfile.ZipFile(tmp, "w", compression=zipfile.ZIP_DEFLATED) as archive:
        for path in files:
            relative = path.relative_to(source).as_posix()
            info = zipfile.ZipInfo(relative, date_time=(1980, 1, 1, 0, 0, 0))
            info.compress_type = zipfile.ZIP_DEFLATED
            info.external_attr = 0o644 << 16
            archive.writestr(info, path.read_bytes())
    os.replace(tmp, output)
finally:
    if tmp.exists():
        tmp.unlink()
print(output)
PY
