#!/usr/bin/env bash

CHANNEL_ROOT="$TMPDIR/conda-mirror"
REQUEST_LOG="$TMPDIR/conda-mirror-requests"
mkdir -p "$CHANNEL_ROOT/mirror/noarch"

start_http_server --dir "$CHANNEL_ROOT" --handler - "$REQUEST_LOG" <<'PY'
import hashlib
import io
import json
import sys
import tarfile
from pathlib import Path

request_log = Path(sys.argv[1])
subdir = Path("mirror") / "noarch"

name = "url-replacement-fixture"
version = "1.0.0"
archive_name = f"{name}-{version}-0.tar.bz2"
files = {
    f"bin/{name}": b"#!/bin/sh\nprintf 'conda-url-replacement-ok\\n'\n",
}
index = {
    "name": name,
    "version": version,
    "build": "0",
    "build_number": 0,
    "depends": [],
    "subdir": "noarch",
}
paths = [{
    "_path": path,
    "path_type": "hardlink",
    "sha256": hashlib.sha256(content).hexdigest(),
    "size_in_bytes": len(content),
} for path, content in files.items()]
metadata = {
    "info/index.json": json.dumps(index).encode(),
    "info/paths.json": json.dumps({"paths_version": 1, "paths": paths}).encode(),
    "info/files": ("\n".join(files) + "\n").encode(),
}
archive_path = subdir / archive_name
with tarfile.open(archive_path, "w:bz2") as archive:
    for path, content in {**files, **metadata}.items():
        info = tarfile.TarInfo(path)
        info.size = len(content)
        info.mode = 0o755 if path.startswith("bin/") else 0o644
        archive.addfile(info, io.BytesIO(content))

archive_data = archive_path.read_bytes()
package = {
    **index,
    "sha256": hashlib.sha256(archive_data).hexdigest(),
    "size": len(archive_data),
}
(subdir / "repodata.json").write_text(json.dumps({
    "info": {"subdir": "noarch"},
    "packages": {archive_name: package},
    "packages.conda": {},
    "removed": [],
    "repodata_version": 1,
}))


class Handler(TestHandler):
    def do_GET(self):
        with request_log.open("a") as log:
            log.write(self.path + "\n")
        super().do_GET()
PY
UPSTREAM="http://conda.invalid/upstream"
MIRROR="http://127.0.0.1:$HTTP_PORT/mirror"

cat >mise.toml <<EOF
[settings]
lockfile = true

[settings.url_replacements]
"$UPSTREAM" = "$MIRROR"

[tools]
"conda:url-replacement-fixture" = { version = "1.0.0", channel = "$UPSTREAM" }
EOF

assert_contains "mise ls-remote conda:url-replacement-fixture" "1.0.0"
mise install
assert "mise exec -- url-replacement-fixture" "conda-url-replacement-ok"
assert_succeed "grep -q '/mirror/noarch/repodata.json' '$REQUEST_LOG'"
assert_succeed "grep -q '/mirror/noarch/url-replacement-fixture-1.0.0-0.tar.bz2' '$REQUEST_LOG'"
assert_succeed "grep -q '$UPSTREAM/noarch/url-replacement-fixture-1.0.0-0.tar.bz2' mise.lock"
assert_fail "grep -q '127.0.0.1' mise.lock"

# Locked installs retain the logical upstream URL and rewrite it again at transport time.
mise uninstall -a conda:url-replacement-fixture
rm -rf "$MISE_DATA_DIR/conda-packages"
: >"$REQUEST_LOG"
mise install
assert "mise exec -- url-replacement-fixture" "conda-url-replacement-ok"
assert_succeed "grep -q '/mirror/noarch/url-replacement-fixture-1.0.0-0.tar.bz2' '$REQUEST_LOG'"
