#!/usr/bin/env bash

# Test the `usage` map inside Tera run scripts for inline tasks

# Basic args + flags with defaults
cat <<'EOF' >mise.toml
[tasks.usage-tera]
description = "Test usage map in tera run scripts"
usage = '''
arg "<environment>" help="Target environment"
flag "-v --verbose" help="Enable verbose output"
flag "--region <region>" help="AWS region" default="us-east-1"
'''
run = '''
echo "Deploying to {{ usage.environment }} in {{ usage.region }}"
{% if usage.verbose %}
echo "Verbose mode enabled"
{% endif %}
'''
EOF

assert "mise run usage-tera staging" "Deploying to staging in us-east-1"
assert "mise run usage-tera staging --region us-west-2" "Deploying to staging in us-west-2"
assert "mise run usage-tera staging --verbose" "\
Deploying to staging in us-east-1
Verbose mode enabled"
assert "mise run usage-tera staging --region eu-central-1 --verbose" "\
Deploying to staging in eu-central-1
Verbose mode enabled"

# Variadic args exposed as arrays in the usage map
cat <<'EOF' >mise.toml
[tasks.usage-tera-tags]
description = "Test variadic args in usage map"
usage = '''
arg "<environment>" help="Target environment"
arg "[tags]" var=#true
'''
run = '''
echo "env={{ usage.environment }}"
echo "tag_count={{ usage.tags | length }}"
{% for tag in usage.tags %}
echo "tag={{ tag }}"
{% endfor %}
'''
EOF

assert "mise run usage-tera-tags prod foo bar" "\
env=prod
tag_count=2
tag=foo
tag=bar"

# Hyphenated flag names become snake_case keys on the usage map (e.g. --foo-bar -> usage.foo_bar)
cat <<'EOF' >mise.toml
[tasks.usage-tera-hyphen]
description = "Test hyphenated flag name mapping to snake_case"
usage = '''
flag "--foo-bar <foo-bar>" help="Hyphenated flag"
'''
run = '''
echo "foo_bar={{ usage.foo_bar }}"
'''
EOF

assert "mise run usage-tera-hyphen --foo-bar value" "foo_bar=value"

# Variadic flags exposed as arrays in the usage map
cat <<'EOF' >mise.toml
[tasks.usage-tera-var-flag]
description = "Test variadic flags in usage map"
usage = '''
flag "--tag <tag>" help="Tag" var=#true
'''
run = '''
echo "tag_count={{ usage.tag | length }}"
{% for tag in usage.tag %}
echo "tag={{ tag }}"
{% endfor %}
'''
EOF

assert "mise run usage-tera-var-flag --tag foo --tag bar" "\
tag_count=2
tag=foo
tag=bar"

assert "mise run usage-tera-var-flag --tag foo" "\
tag_count=1
tag=foo"

# Variadic flags are exposed as arrays and can be joined
cat <<'EOF' >mise.toml
[tasks.usage-tera-var-flag-join]
description = "Test variadic flags joined with a separator"
usage = '''
flag "--tag <tag>" help="Tag" var=#true
'''
run = '''
echo "tags={{ usage.tag | join(sep='::') }}"
'''
EOF

assert "mise run usage-tera-var-flag-join --tag foo --tag bar" "tags=foo::bar"

# Variadic flags with multiple defaults are exposed as arrays in the usage map
cat <<'EOF' >mise.toml
[tasks.usage-tera-var-flag-default]
description = "Test variadic flags with default in usage map"
usage = '''
flag "--tag <tag>" help="Tag" var=#true {
    default {
        "foo"
        "bar"
    }
}
'''
run = '''
echo "tags={{ usage.tag | join(sep='::') }}"
'''
EOF

assert "mise run usage-tera-var-flag-default" "tags=foo::bar"

# Variadic flags with string defaults stay as single element (not split)
cat <<'EOF' >mise.toml
[tasks.usage-tera-var-flag-default-string]
description = "Test variadic flags with string default in usage map"
usage = '''
flag "--tag <tag>" help="Tag" var=#true default="foo bar"
'''
run = '''
echo "tags={{ usage.tag | join(sep='::') }}"
'''
EOF

assert "mise run usage-tera-var-flag-default-string" "tags=foo bar"

# Args with defaults
cat <<'EOF' >mise.toml
[tasks.usage-tera-arg-default]
description = "Test arg with default in usage map"
usage = '''
arg "<name>" default="world"
'''
run = '''
echo "Hello, {{ usage.name }}!"
'''
EOF

assert "mise run usage-tera-arg-default" "Hello, world!"
assert "mise run usage-tera-arg-default -- Alice" "Hello, Alice!"

# Variadic args with multiple defaults
cat <<'EOF' >mise.toml
[tasks.usage-tera-var-arg-default]
description = "Test variadic arg with defaults in usage map"
usage = '''
arg "[names]" var=#true {
    default {
        "alice"
        "bob"
    }
}
'''
run = '''
echo "Hello, {{ usage.names | join(sep=' and ') }}!"
'''
EOF

assert "mise run usage-tera-var-arg-default" "Hello, alice and bob!"
assert "mise run usage-tera-var-arg-default -- charlie" "Hello, charlie!"

# Path filters (file_stem, basename, dirname, extname) work with required args
# Regression test for https://github.com/jdx/mise/discussions/7239
cat <<'EOF' >mise.toml
[tasks.usage-tera-file-stem]
description = "Test file_stem filter with required arg"
usage = '''
arg "<file>" help="The file path"
'''
run = '''
echo "stem={{ usage.file | file_stem }}"
'''
EOF

assert "mise run usage-tera-file-stem -- /path/to/myfile.txt" "stem=myfile"
assert "mise run usage-tera-file-stem -- foo.bar.baz" "stem=foo.bar"

# Test all path filters together
cat <<'EOF' >mise.toml
[tasks.usage-tera-path-filters]
description = "Test all path filters with required arg"
usage = '''
arg "<file>" help="The file path"
'''
run = '''
echo "dirname={{ usage.file | dirname }}"
echo "basename={{ usage.file | basename }}"
echo "extname={{ usage.file | extname }}"
echo "file_stem={{ usage.file | file_stem }}"
'''
EOF

assert "mise run usage-tera-path-filters -- /path/to/file.txt" "\
dirname=/path/to
basename=file.txt
extname=txt
file_stem=file"
