#!/usr/bin/env bash

cat <<'EOF' >mise.toml
[tasks."test:local"]
run = "echo zero groups"

[tasks."test:units:local"]
run = "echo units local"

[tasks."test:integration:local"]
run = "echo integration local"

[tasks."test:e2e:happy:local"]
run = "echo e2e happy local"

[tasks.one-level]
depends = ["test:*:local"]
run = "echo one-level aggregate"

[tasks.recursive]
depends = ["test:**:local"]
run = "echo recursive aggregate"
EOF

# A single star stays within one colon-delimited group.
output="$(mise run 'test:*:local')"
assert_contains_text "$output" "units local"
assert_contains_text "$output" "integration local"
assert_not_contains_text "$output" "zero groups"
assert_not_contains_text "$output" "e2e happy local"

# A double star spans zero or more groups.
output="$(mise run 'test:**:local')"
assert_contains_text "$output" "zero groups"
assert_contains_text "$output" "units local"
assert_contains_text "$output" "integration local"
assert_contains_text "$output" "e2e happy local"

# Dependency patterns use the same matcher as direct execution.
output="$(mise run one-level)"
assert_contains_text "$output" "units local"
assert_not_contains_text "$output" "e2e happy local"
output="$(mise run recursive)"
assert_contains_text "$output" "zero groups"
assert_contains_text "$output" "e2e happy local"

# Monorepo task patterns apply the group rules only to the task-name portion.
export MISE_EXPERIMENTAL=1
mkdir -p projects/app
cat <<'EOF' >mise.toml
monorepo_root = true

[settings]
task.auto_infer = ["node"]

[monorepo]
config_roots = ["projects/app"]
EOF
cat <<'EOF' >projects/app/mise.toml
[tasks."test:units:local"]
run = "echo monorepo units local"

[tasks."test:e2e:happy:local"]
run = "echo monorepo e2e happy local"
EOF

output="$(mise run '//projects/app:test:*:local')"
assert_contains_text "$output" "monorepo units local"
assert_not_contains_text "$output" "monorepo e2e happy local"
output="$(mise run '//projects/app:test:**:local')"
assert_contains_text "$output" "monorepo units local"
assert_contains_text "$output" "monorepo e2e happy local"

# Inferred workspace tasks keep provider/project matching unchanged while task
# groups after `#` follow the same wildcard depth rules.
mkdir -p bin packages/app
cat <<'EOF' >bin/npm
#!/bin/sh
printf '%s\n' "$*"
EOF
chmod +x bin/npm
export PATH="$PWD/bin:$PATH"

cat <<'EOF' >package.json
{
  "packageManager": "npm@11.0.0",
  "workspaces": ["packages/*"]
}
EOF
cat <<'EOF' >packages/app/package.json
{
  "name": "@scope/app",
  "scripts": {
    "test:units:local": "echo workspace units local",
    "test:e2e:happy:local": "echo workspace e2e happy local"
  }
}
EOF

output="$(mise -q run 'node:@scope/app#test:*:local')"
assert_contains_text "$output" "run test:units:local"
assert_not_contains_text "$output" "run test:e2e:happy:local"
output="$(mise -q run 'node:@scope/app#test:**:local')"
assert_contains_text "$output" "run test:units:local"
assert_contains_text "$output" "run test:e2e:happy:local"
