#!/usr/bin/env bash

PLUGIN_DIR="$PWD/catalog-plugin"
MARKER="$PWD/catalog-calls"
SEARCH_MARKER="$PWD/catalog-search-calls"
mkdir -p "$PLUGIN_DIR/hooks"

cat >"$PLUGIN_DIR/metadata.lua" <<'LUA'
PLUGIN = {
    name = "catalog_plugin",
    version = "0.1.0",
    description = "backend tool discovery test plugin",
}
LUA

cat >"$PLUGIN_DIR/hooks/backend_search_tools.lua" <<LUA
function PLUGIN:BackendSearchTools(ctx)
    local marker = io.open([[$SEARCH_MARKER]], "a")
    marker:write(ctx.query .. "\n")
    marker:close()
    if ctx.query == "dynamic" then
        return {tools = {{name = "dynamic", description = "A dynamically discovered tool"}}}
    end
    return {tools = {}}
end
LUA

cat >"$PLUGIN_DIR/hooks/backend_list_tools.lua" <<LUA
function PLUGIN:BackendListTools(ctx)
    local marker = io.open([[$MARKER]], "a")
    marker:write("called\n")
    marker:close()
    return {
        tools = {
            {name = "formatter", description = "A formatter from a backend plugin"},
            {name = "linter"},
            {name = "other:backend", description = "invalid name"},
        },
    }
end
LUA

cat >"$PLUGIN_DIR/hooks/backend_list_versions.lua" <<'LUA'
function PLUGIN:BackendListVersions(ctx)
    return {versions = {"1.0.0"}}
end
LUA

cat >"$PLUGIN_DIR/hooks/backend_install.lua" <<'LUA'
function PLUGIN:BackendInstall(ctx)
    return {}
end
LUA

cat >"$PLUGIN_DIR/hooks/backend_exec_env.lua" <<'LUA'
function PLUGIN:BackendExecEnv(ctx)
    return {env_vars = {}}
end
LUA

mise plugins link catalog_plugin "$PLUGIN_DIR"

assert_contains "mise search --match-type equal formatter" "catalog_plugin:formatter  A formatter from a backend plugin"
assert_contains "mise search --match-type equal catalog_plugin:formatter" "catalog_plugin:formatter"
assert_contains "mise search --match-type equal linter" "catalog_plugin:linter"
assert_fail "mise search --match-type equal other:backend" "not found in registry or installed backend catalogs"
assert_contains "mise search --complete-ids" "catalog_plugin:formatter"
assert_contains "mise search --complete" 'catalog_plugin\:formatter:A formatter from a backend plugin'
assert_contains "mise search --complete catalog_plugin:" 'catalog_plugin\:formatter:A formatter from a backend plugin'
assert_contains "mise search --match-type equal dynamic" "catalog_plugin:dynamic  A dynamically discovered tool"
assert_contains "mise search --match-type equal catalog_plugin:dynamic" "catalog_plugin:dynamic"
assert_contains "mise search --complete catalog_plugin:dynamic" 'catalog_plugin\:dynamic:A dynamically discovered tool'

# Repeated discovery reads the cached catalog instead of executing the hook again.
assert "wc -l < '$MARKER' | tr -d ' '" "1"
assert "grep -c '^dynamic$' '$SEARCH_MARKER'" "1"
assert "awk 'NF == 0 { count++ } END { print count + 0 }' '$SEARCH_MARKER'" "0"
