#!/usr/bin/env bash

# RubyGems prereleases, listed through the JSON API of a configured `source`.
# A source skips the versions host, so this is the path where mise reads
# rubygems' own response, which flags each prerelease.
#
#   1. `latest` skips dotted prereleases such as `2.1.0.beta3`, which the shared
#      prerelease pattern does not recognize.
#   2. An exact request for one still resolves. Taking the response's
#      `prerelease` flag dropped it before the exact match could accept it.

# A fake registry answering the versions endpoint newest first, as rubygems.org
# does.
cat >registry.py <<'PYTHON'
import json
import os
import threading
import time
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path

versions = json.dumps([
    {"number": "2.1.0.beta3", "prerelease": True, "created_at": "2026-03-03T00:00:00.000Z"},
    {"number": "2.1.0.alpha1", "prerelease": True, "created_at": "2026-03-02T00:00:00.000Z"},
    {"number": "2.0.0", "prerelease": False, "created_at": "2026-03-01T00:00:00.000Z"},
    {"number": "1.0.0", "prerelease": False, "created_at": "2026-01-01T00:00:00.000Z"},
]).encode()


class Handler(BaseHTTPRequestHandler):
    def log_message(self, *args):
        pass

    def do_GET(self):
        if self.path != "/api/v1/versions/internal-cli.json":
            self.send_error(404)
            return
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.send_header("Content-Length", str(len(versions)))
        self.end_headers()
        self.wfile.write(versions)


def exit_with_test():
    # Stop once the test script that started us is gone, so the fixture needs
    # no cleanup trap and never outlives the test.
    parent = os.getppid()
    while os.getppid() == parent:
        time.sleep(0.5)
    os._exit(0)


threading.Thread(target=exit_with_test, daemon=True).start()
server = ThreadingHTTPServer(("127.0.0.1", 0), Handler)
Path("registry.port").write_text(str(server.server_port))
server.serve_forever()
PYTHON

python3 registry.py &
registry_pid=$!
wait_for_file registry.port "gem registry port" 30 "$registry_pid"
port="$(cat registry.port)"

cat >mise.toml <<EOF
[tools]
"gem:internal-cli" = { version = "latest", source = "http://127.0.0.1:${port}" }
EOF

assert "mise latest gem:internal-cli" "2.0.0"
assert "mise latest gem:internal-cli@2.1.0.beta3" "2.1.0.beta3"
assert "mise latest gem:internal-cli@2.1.0.alpha1" "2.1.0.alpha1"
assert "MISE_PRERELEASES=1 mise latest gem:internal-cli" "2.1.0.beta3"
