#!/usr/bin/env bash

# Test that nested config files (like .config/mise/config.toml) are properly
# detected in monorepo subdirectories.
#
# When a subdir has a nested config, the include-only fallback should NOT run
# and should NOT load default includes (which could overwrite tasks from the
# nested config's custom includes).

export MISE_EXPERIMENTAL=1

# Create monorepo root config
cat <<'TOML' >mise.toml
experimental_monorepo_root = true

[monorepo]
config_roots = ["projects/*"]
TOML

# Create subdirectory with NESTED config path (.config/mise/config.toml)
# instead of the simple mise.toml
mkdir -p projects/nested-config/.config/mise

cat <<'TOML' >projects/nested-config/.config/mise/config.toml
# This is a nested config file - the subdir_has_config check must detect it

[task_config]
# Custom includes - ONLY these should be loaded
includes = ["custom-tasks"]

[tasks.config-task]
run = "echo 'task from nested config'"
TOML

# Create tasks in the CUSTOM include path (specified in nested config)
# Includes are resolved relative to the config root (projects/nested-config/),
# so for .config/mise/config.toml, custom-tasks is at projects/nested-config/custom-tasks
mkdir -p projects/nested-config/custom-tasks
cat <<'SCRIPT' >projects/nested-config/custom-tasks/custom-task
#!/usr/bin/env bash
echo "task from custom includes"
SCRIPT
chmod +x projects/nested-config/custom-tasks/custom-task

# Create tasks in the DEFAULT include path (.mise/tasks)
# These should NOT be loaded because the nested config exists
# and has its own custom includes
mkdir -p projects/nested-config/.mise/tasks
cat <<'SCRIPT' >projects/nested-config/.mise/tasks/default-task
#!/usr/bin/env bash
echo "task from default includes - should NOT appear"
SCRIPT
chmod +x projects/nested-config/.mise/tasks/default-task

# --- Assertions ---

# Test 1: Tasks from the nested config file should be discovered
assert_contains "mise tasks --all" "//projects/nested-config:config-task"
assert_contains "mise run '//projects/nested-config:config-task'" "task from nested config"

# Test 2: Tasks from custom includes (specified in nested config) should be discovered
assert_contains "mise tasks --all" "//projects/nested-config:custom-task"
assert_contains "mise run '//projects/nested-config:custom-task'" "task from custom includes"

# Test 3: Tasks from DEFAULT includes (.mise/tasks) should NOT be loaded
# because the nested config exists and has its own includes
assert_not_contains "mise tasks --all" "//projects/nested-config:default-task"

# ============================================================================
# Test case 2: Nested config using DEFAULT includes (no custom task_config.includes)
# ============================================================================

# Create another subdirectory with nested config but NO custom includes
mkdir -p projects/nested-default/.config/mise

cat <<'TOML' >projects/nested-default/.config/mise/config.toml
# Nested config WITHOUT custom includes - should use default includes
# Default includes are resolved relative to the config root (projects/nested-default/)

[tasks.config-task2]
run = "echo 'task from nested-default config'"
TOML

# Create tasks in the DEFAULT include path, relative to the config root
# For .config/mise/config.toml with config_root=projects/nested-default/,
# the default ".mise/tasks" resolves to projects/nested-default/.mise/tasks
mkdir -p projects/nested-default/.mise/tasks
cat <<'SCRIPT' >projects/nested-default/.mise/tasks/default-include-task
#!/usr/bin/env bash
echo "task from default includes in nested config"
SCRIPT
chmod +x projects/nested-default/.mise/tasks/default-include-task

# Also create tasks at the config-file-parent-relative path (.config/mise/.mise/tasks)
# These should NOT be loaded (default includes are relative to config root, not config file parent)
mkdir -p projects/nested-default/.config/mise/.mise/tasks
cat <<'SCRIPT' >projects/nested-default/.config/mise/.mise/tasks/wrong-location-task
#!/usr/bin/env bash
echo "task from wrong location - should NOT appear"
SCRIPT
chmod +x projects/nested-default/.config/mise/.mise/tasks/wrong-location-task

# Test 5: Tasks from nested config using default includes should work
assert_contains "mise tasks --all" "//projects/nested-default:config-task2"
assert_contains "mise run '//projects/nested-default:config-task2'" "task from nested-default config"

# Test 6: Tasks from default include path (relative to config root) should be loaded
assert_contains "mise tasks --all" "//projects/nested-default:default-include-task"
assert_contains "mise run '//projects/nested-default:default-include-task'" "task from default includes in nested config"

# Test 7: Tasks from config-file-parent-relative .mise/tasks should NOT be loaded
# (because includes are relative to config root, not config file location)
assert_not_contains "mise tasks --all" "//projects/nested-default:wrong-location-task"

# ============================================================================
# Test case 3: 1-level nested config (.mise/config.toml)
# This is a common alternative to .config/mise/config.toml
# ============================================================================

mkdir -p projects/mise-dir/.mise

cat <<'TOML' >projects/mise-dir/.mise/config.toml
# 1-level nested config at .mise/config.toml
# Custom includes pointing to "tasks" (relative to config root projects/mise-dir/)
[task_config]
includes = ["tasks"]

[tasks.mise-dir-task]
run = "echo 'task from .mise/config.toml'"
TOML

# Create tasks in the config-root-relative include path (projects/mise-dir/tasks)
# This is "tasks" relative to config root (projects/mise-dir/)
mkdir -p projects/mise-dir/tasks
cat <<'SCRIPT' >projects/mise-dir/tasks/config-relative-task
#!/usr/bin/env bash
echo "task from config-relative include"
SCRIPT
chmod +x projects/mise-dir/tasks/config-relative-task

# Create tasks in the config-file-parent-relative path (.mise/tasks)
# These should NOT be loaded (includes resolve from config root, not config file parent)
mkdir -p projects/mise-dir/.mise/tasks
cat <<'SCRIPT' >projects/mise-dir/.mise/tasks/fallback-task
#!/usr/bin/env bash
echo "task from fallback - should NOT appear"
SCRIPT
chmod +x projects/mise-dir/.mise/tasks/fallback-task

# Test 8: Tasks from 1-level nested config should be discovered
assert_contains "mise tasks --all" "//projects/mise-dir:mise-dir-task"
assert_contains "mise run '//projects/mise-dir:mise-dir-task'" "task from .mise/config.toml"

# Test 9: Tasks from config-root-relative includes should be loaded
assert_contains "mise tasks --all" "//projects/mise-dir:config-relative-task"
assert_contains "mise run '//projects/mise-dir:config-relative-task'" "task from config-relative include"

# Test 10: Tasks from config-file-parent-relative path should NOT be loaded
assert_not_contains "mise tasks --all" "//projects/mise-dir:fallback-task"

# ============================================================================
# Test case 4: Standard root-level configs (mise.toml, .mise.toml)
# ============================================================================

# Test with mise.toml (most common)
mkdir -p projects/standard-config
cat <<'TOML' >projects/standard-config/mise.toml
[task_config]
includes = ["tasks"]

[tasks.standard-task]
run = "echo 'task from standard mise.toml'"
TOML

mkdir -p projects/standard-config/tasks
cat <<'SCRIPT' >projects/standard-config/tasks/file-task
#!/usr/bin/env bash
echo "file task from standard config"
SCRIPT
chmod +x projects/standard-config/tasks/file-task

# Test 11: Standard mise.toml should work
assert_contains "mise tasks --all" "//projects/standard-config:standard-task"
assert_contains "mise run '//projects/standard-config:standard-task'" "task from standard mise.toml"
assert_contains "mise tasks --all" "//projects/standard-config:file-task"
assert_contains "mise run '//projects/standard-config:file-task'" "file task from standard config"

# Test with .mise.toml (alternative common format)
mkdir -p projects/dotmise-config
cat <<'TOML' >projects/dotmise-config/.mise.toml
[tasks.dotmise-task]
run = "echo 'task from .mise.toml'"
TOML

# Test 12: .mise.toml should also work
assert_contains "mise tasks --all" "//projects/dotmise-config:dotmise-task"
assert_contains "mise run '//projects/dotmise-config:dotmise-task'" "task from .mise.toml"
