#!/usr/bin/env bash
# Tests for scrumMaster measurement methods (CMM4)
# Tests private parsing methods with synthetic pane content — no live tmux needed

level=$1
if [ -z "$level" ]; then
  level=1
fi
info.log "starting: ${BASH_SOURCE[@]##*/} <LOG_LEVEL=$level>"

source this
source test.suite
source $OOSH_DIR/scrumMaster

log.level $level

# Test metrics directory (isolated)
TEST_METRICS_DIR="/tmp/scrumMaster_test_metrics_$$"
SCRUMMASTER_METRICS_DIR="$TEST_METRICS_DIR"

# Cleanup
cleanupMetrics() {
  rm -rf "$TEST_METRICS_DIR" 2>/dev/null
}
cleanupMetrics

# ============================================================================
# T1: normalize.k converts "4.6k" to 4600
# ============================================================================
test.case $level "T1: normalize.k converts 4.6k to 4600" true
local_result=$(private.scrumMaster.parse.normalize.k "4.6k")
if [ "$local_result" = "4600" ]; then
  expect.pass "4.6k → 4600"
else
  expect.fail "expected 4600, got $local_result"
fi

# ============================================================================
# T2: normalize.k passes through plain numbers
# ============================================================================
test.case $level "T2: normalize.k passes through 590" true
local_result=$(private.scrumMaster.parse.normalize.k "590")
if [ "$local_result" = "590" ]; then
  expect.pass "590 → 590"
else
  expect.fail "expected 590, got $local_result"
fi

# ============================================================================
# T3: parse.tokens extracts down tokens with k suffix
# ============================================================================
CONTENT_TOKENS="Some output
↓ 7.9k tokens  ↑ 20.3k tokens
More output"

test.case $level "T3: parse.tokens extracts down tokens (7.9k)" true
private.scrumMaster.parse.tokens "$CONTENT_TOKENS"
if [ "$METRIC_TOKENS_DOWN" = "7900" ]; then
  expect.pass "down=7900"
else
  expect.fail "expected down=7900, got $METRIC_TOKENS_DOWN"
fi

# ============================================================================
# T4: parse.tokens extracts up tokens with k suffix
# ============================================================================
test.case $level "T4: parse.tokens extracts up tokens (20.3k)" true
private.scrumMaster.parse.tokens "$CONTENT_TOKENS"
if [ "$METRIC_TOKENS_UP" = "20300" ]; then
  expect.pass "up=20300"
else
  expect.fail "expected up=20300, got $METRIC_TOKENS_UP"
fi

# ============================================================================
# T5: parse.tokens extracts plain number tokens
# ============================================================================
CONTENT_PLAIN="↓ 590 tokens  ↑ 120 tokens"

test.case $level "T5: parse.tokens plain numbers" true
private.scrumMaster.parse.tokens "$CONTENT_PLAIN"
if [ "$METRIC_TOKENS_DOWN" = "590" ] && [ "$METRIC_TOKENS_UP" = "120" ]; then
  expect.pass "down=590 up=120"
else
  expect.fail "expected down=590 up=120, got down=$METRIC_TOKENS_DOWN up=$METRIC_TOKENS_UP"
fi

# ============================================================================
# T6: parse.timing extracts think time
# ============================================================================
CONTENT_TIMING="Kneading… thought for 33s
(4m 9s, 14 tool uses, ↓ 7.9k tokens)"

test.case $level "T6: parse.timing extracts think time" true
private.scrumMaster.parse.timing "$CONTENT_TIMING"
if [ "$METRIC_THINK_TIME_S" = "33" ]; then
  expect.pass "think=33s"
else
  expect.fail "expected think=33, got $METRIC_THINK_TIME_S"
fi

# ============================================================================
# T7: parse.timing extracts wall time
# ============================================================================
test.case $level "T7: parse.timing extracts wall time" true
private.scrumMaster.parse.timing "$CONTENT_TIMING"
if [ "$METRIC_WALL_TIME_S" = "249" ]; then
  expect.pass "wall=249s (4m 9s)"
else
  expect.fail "expected wall=249, got $METRIC_WALL_TIME_S"
fi

# ============================================================================
# T8: parse.timing extracts tool uses
# ============================================================================
test.case $level "T8: parse.timing extracts tool uses" true
private.scrumMaster.parse.timing "$CONTENT_TIMING"
if [ "$METRIC_TOOL_USES" = "14" ]; then
  expect.pass "tools=14"
else
  expect.fail "expected tools=14, got $METRIC_TOOL_USES"
fi

# ============================================================================
# T9: parse.state detects active (present-tense spinner)
# ============================================================================
CONTENT_ACTIVE="Kneading… thought for 12s"

test.case $level "T9: parse.state detects active" true
private.scrumMaster.parse.state "$CONTENT_ACTIVE"
if [ "$METRIC_STATE" = "active" ]; then
  expect.pass "state=active"
else
  expect.fail "expected active, got $METRIC_STATE"
fi

# ============================================================================
# T10: parse.state detects completed (past-tense)
# ============================================================================
CONTENT_COMPLETED="Brewed for 2m 15s"

test.case $level "T10: parse.state detects completed" true
private.scrumMaster.parse.state "$CONTENT_COMPLETED"
if [ "$METRIC_STATE" = "completed" ]; then
  expect.pass "state=completed"
else
  expect.fail "expected completed, got $METRIC_STATE"
fi

# ============================================================================
# T11: parse.state detects idle prompt
# ============================================================================
CONTENT_IDLE="some output

> "

test.case $level "T11: parse.state detects idle" true
private.scrumMaster.parse.state "$CONTENT_IDLE"
if [ "$METRIC_STATE" = "idle" ]; then
  expect.pass "state=idle"
else
  expect.fail "expected idle, got $METRIC_STATE"
fi

# ============================================================================
# T12: parse.state detects permission prompt
# ============================================================================
CONTENT_PERM="Allow this tool call?
  Allow     Deny"

test.case $level "T12: parse.state detects permission" true
private.scrumMaster.parse.state "$CONTENT_PERM"
if [ "$METRIC_STATE" = "permission" ]; then
  expect.pass "state=permission"
else
  expect.fail "expected permission, got $METRIC_STATE"
fi

# ============================================================================
# T13: metrics.save creates file
# ============================================================================
METRIC_TOKENS_UP=500
METRIC_TOKENS_DOWN=1000
METRIC_STATE="active"
METRIC_ACTIVITY="Kneading"

test.case $level "T13: metrics.save creates file" true
private.scrumMaster.metrics.save "test-agent" "testSession:0.0"
if ls "$TEST_METRICS_DIR"/test-agent.*.env >/dev/null 2>&1; then
  expect.pass "file created in $TEST_METRICS_DIR"
else
  expect.fail "no metric file found in $TEST_METRICS_DIR"
fi

# ============================================================================
# T14: public measure functions exist
# ============================================================================
test.case $level "T14: pane.measure function exists" true
if [ "$(type -t scrumMaster.pane.measure)" = "function" ]; then
  expect.pass "pane.measure is a function"
else
  expect.fail "pane.measure not found"
fi

# Cleanup
cleanupMetrics

test.suite.save.results
