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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
EXT_DIR="$ROOT_DIR/extension/chromium"
LEGACY_MIRROR_DIR="$ROOT_DIR/www/assets/gestor-pass-extension-chromium"
OUTPUT_RELATIVE_PATH="${1:-www/assets/gestor-pass-extension-chromium.zip}"
OUTPUT_PATH="$ROOT_DIR/$OUTPUT_RELATIVE_PATH"
TMP_PATH="${OUTPUT_PATH}.tmp"

if [[ -d "$LEGACY_MIRROR_DIR" ]]; then
  echo "Existe una copia obsoleta en www/assets/gestor-pass-extension-chromium. Usa solo extension/chromium como fuente de verdad." >&2
  exit 1
fi

REQUIRED_FILES=(
  "manifest.json"
  "src/background.js"
  "src/content.js"
  "src/options.html"
  "src/options.js"
  "src/popup.html"
  "src/popup.js"
  "src/success.html"
  "src/success.js"
  "icons/icon16.png"
  "icons/icon32.png"
  "icons/icon48.png"
  "icons/icon128.png"
)

for rel_path in "${REQUIRED_FILES[@]}"; do
  if [[ ! -f "$EXT_DIR/$rel_path" ]]; then
    echo "Falta archivo requerido para release: extension/chromium/$rel_path" >&2
    exit 1
  fi
done

python - "$EXT_DIR/manifest.json" <<'PY'
import json
import re
import sys

manifest_path = sys.argv[1]

with open(manifest_path, encoding="utf-8") as fh:
    manifest = json.load(fh)

version = manifest.get("version", "")
if not re.fullmatch(r"\d+\.\d+\.\d+", version):
    raise SystemExit(
        f"manifest.version invalido: {version!r}. Usa semver MAJOR.MINOR.PATCH."
    )

expected_icons = {
    "16": "icons/icon16.png",
    "32": "icons/icon32.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png",
}
manifest_icons = manifest.get("icons", {})

invalid_icon_entries = []
for key, expected_value in expected_icons.items():
    current_value = manifest_icons.get(key)
    if current_value != expected_value:
        invalid_icon_entries.append((key, current_value, expected_value))

if invalid_icon_entries:
    details = ", ".join(
        f"{key}:actual={actual!r}:esperado={expected!r}"
        for key, actual, expected in invalid_icon_entries
    )
    raise SystemExit(f"manifest.icons invalido ({details})")

print(f"Manifest OK (version {version})")
PY

mkdir -p "$(dirname "$OUTPUT_PATH")"
rm -f "$TMP_PATH" "$OUTPUT_PATH"

if command -v zip >/dev/null 2>&1; then
  (
    cd "$EXT_DIR"
    zip -r "$TMP_PATH" manifest.json src/ icons/ -q
  )
else
  python - "$EXT_DIR" "$TMP_PATH" <<'PY'
import os
import sys
import zipfile

ext_dir = sys.argv[1]
output_zip = sys.argv[2]
entries = ("manifest.json", "src", "icons")

with zipfile.ZipFile(output_zip, "w", compression=zipfile.ZIP_DEFLATED) as zf:
    for entry in entries:
        entry_path = os.path.join(ext_dir, entry)
        if os.path.isdir(entry_path):
            for root, _, files in os.walk(entry_path):
                for file_name in files:
                    file_path = os.path.join(root, file_name)
                    rel_path = os.path.relpath(file_path, ext_dir).replace("\\", "/")
                    zf.write(file_path, rel_path)
        else:
            zf.write(entry_path, entry.replace("\\", "/"))
PY
fi

if [[ ! -f "$TMP_PATH" ]]; then
  echo "No se pudo generar el ZIP temporal en $TMP_PATH" >&2
  exit 1
fi

ZIP_SIZE_BYTES="$(wc -c < "$TMP_PATH" | tr -d ' ')"
if [[ "$ZIP_SIZE_BYTES" -lt 1000 ]]; then
  echo "ZIP demasiado pequeno (${ZIP_SIZE_BYTES} bytes). Revisa extension/chromium." >&2
  exit 1
fi

MAX_CHROME_EXTENSION_BYTES=10485760
if [[ "$ZIP_SIZE_BYTES" -gt "$MAX_CHROME_EXTENSION_BYTES" ]]; then
  echo "ZIP excede 10MB (${ZIP_SIZE_BYTES} bytes)." >&2
  exit 1
fi

python - "$TMP_PATH" <<'PY'
import sys
import zipfile

zip_path = sys.argv[1]
required_entries = {
    "manifest.json",
    "src/background.js",
    "src/content.js",
    "src/options.html",
    "src/options.js",
    "src/popup.html",
    "src/popup.js",
    "src/success.html",
    "src/success.js",
    "icons/icon16.png",
    "icons/icon32.png",
    "icons/icon48.png",
    "icons/icon128.png",
}

with zipfile.ZipFile(zip_path, "r") as zf:
    entries = {entry.filename.rstrip("/") for entry in zf.infolist()}

missing = sorted(required_entries - entries)
if missing:
    raise SystemExit(f"ZIP incompleto, faltan entradas: {', '.join(missing)}")

if "manifest.json" not in entries:
    raise SystemExit("ZIP invalido: manifest.json debe estar en la raiz")

print("ZIP structure OK")
PY

mv "$TMP_PATH" "$OUTPUT_PATH"
echo "Extension ZIP listo en $OUTPUT_PATH (${ZIP_SIZE_BYTES} bytes)"
