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

repo="${1:-pypi}"
tag="${2:-${RELEASE_TAG:-}}"
if [ -z "$tag" ]; then
  echo "usage: scripts/release/build <pypi|testpypi> vX.Y.Z" >&2
  exit 1
fi

case "$repo" in
  pypi)
    expected_sdist_prefix="imaegete"
    expected_wheel_prefix="imaegete"
    ;;
  testpypi)
    expected_sdist_prefix="testimaegete"
    expected_wheel_prefix="testimaegete"
    ;;
  *)
    echo "unknown repository: $repo" >&2
    exit 1
    ;;
esac

version="${tag#v}"
PYTHON_BIN="${PYTHON_BIN:-python3}"
export PYTHON_BIN
"$PYTHON_BIN" -m pip install --upgrade pip
"$PYTHON_BIN" -m pip install build tomli tomli-w twine

if ! git rev-parse --show-toplevel >/dev/null 2>&1; then
  echo "release builds must be run from a git work tree" >&2
  exit 1
fi

if ! git rev-parse --verify "$tag^{commit}" >/dev/null 2>&1; then
  echo "tag $tag does not exist" >&2
  exit 1
fi

head_commit="$(git rev-parse HEAD)"
tag_commit="$(git rev-parse "$tag^{commit}")"
if [ "$head_commit" != "$tag_commit" ]; then
  echo "HEAD is not checked out at tag $tag" >&2
  exit 1
fi

if [ -n "$(git status --porcelain --untracked-files=all)" ]; then
  echo "working tree is not clean; commit, stash, or remove changes before releasing" >&2
  exit 1
fi

staging="$(mktemp -d)"
trap 'rm -rf "$staging"' EXIT
"$PYTHON_BIN" - <<'PY' "$staging"
from pathlib import Path
import shutil, sys
src = Path(".").resolve()
dst = Path(sys.argv[1])
exclude = {
    ".git",
    "dist",
    "artifacts",
    ".venv",
    "venv",
    "__pycache__",
    ".pytest_cache",
    ".mypy_cache",
}
for child in src.iterdir():
    if child.name in exclude:
        continue
    target = dst / child.name
    if child.is_dir():
        shutil.copytree(child, target)
    else:
        shutil.copy2(child, target)
PY

if [ "$repo" = "testpypi" ]; then
  "$PYTHON_BIN" - <<'PY' "$staging/pyproject.toml"
from pathlib import Path
import re, sys, tomli, tomli_w
p = Path(sys.argv[1])
data = tomli.loads(p.read_text(encoding="utf-8"))
data["project"]["name"] = "TestImaegete"
deps = data["project"].get("dependencies", [])
out = []
for dep in deps:
    d = dep.strip()
    if re.match(r"(?i)^GlavnaQt\b", d):
        out.append(re.sub(r"(?i)^GlavnaQt\b", "TestGlavnaQt", d))
    elif re.match(r"(?i)^confumo\b", d):
        out.append(re.sub(r"(?i)^confumo\b", "TestConfumo", d))
    else:
        out.append(d)
data["project"]["dependencies"] = out
p.write_text(tomli_w.dumps(data), encoding="utf-8")
PY
fi

expected_sdist="$expected_sdist_prefix-$version.tar.gz"
expected_wheel="$expected_wheel_prefix-$version-py3-none-any.whl"
outdir="$PWD/artifacts/release/$repo"

(
  cd "$staging"
  rm -rf dist
  SETUPTOOLS_SCM_PRETEND_VERSION="$version" "$PYTHON_BIN" -m build
  "$PYTHON_BIN" -m twine check dist/*
  test -f "dist/$expected_sdist"
  test -f "dist/$expected_wheel"
  rm -rf "$outdir"
  mkdir -p "$outdir"
  cp -f "dist/$expected_sdist" "$outdir/"
  cp -f "dist/$expected_wheel" "$outdir/"
)

echo "Built artifacts under artifacts/release/$repo/"
