#!/usr/bin/env bash
# Tests for user — OOSH user and SSH identity management
# Tests: id, list, list.all, list.groups, get.current.identity, ssh.status, list.other.identities

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

source this
source test.suite

log.level $level

# ============================================================================
# T1: user is callable
# ============================================================================
test.case $level "user is callable" \
  which user

if which user &>/dev/null; then
  expect.pass "user found on PATH"
else
  expect.fail "user should be on PATH"
fi

# ============================================================================
# T2: user.id returns current user id
# ============================================================================
test.case $level "user.id returns user id" \
  bash -c 'source this; source user; user.id -u -n'

ID_OUTPUT=$(bash -c 'source this; source user; user.id -u -n 2>/dev/null')
if [ "$ID_OUTPUT" = "$(id -u -n)" ]; then
  expect.pass "user.id -u -n returns $(id -u -n)"
else
  expect.fail "user.id -u -n should return $(id -u -n), got: $ID_OUTPUT"
fi

# ============================================================================
# T3: user.list returns users (filters _ prefixed)
# ============================================================================
test.case $level "user.list returns users" \
  bash -c 'source this; source user; user.list'

LIST_OUTPUT=$(bash -c 'source this; source user; user.list 2>/dev/null')
if [ -n "$LIST_OUTPUT" ]; then
  expect.pass "user.list returned users"
else
  expect.fail "user.list should return at least one user"
fi

# ============================================================================
# T4: user.list.all returns all users including system
# ============================================================================
test.case $level "user.list.all returns all users" \
  bash -c 'source this; source user; user.list.all'

ALL_OUTPUT=$(bash -c 'source this; source user; user.list.all 2>/dev/null')
if [ -n "$ALL_OUTPUT" ]; then
  # list.all should have >= list (includes _ prefixed)
  ALL_COUNT=$(echo "$ALL_OUTPUT" | wc -l | tr -d ' ')
  expect.pass "user.list.all returned $ALL_COUNT users"
else
  expect.fail "user.list.all should return users"
fi

# ============================================================================
# T5: user.list.groups returns groups
# ============================================================================
test.case $level "user.list.groups returns groups" \
  bash -c 'source this; source user; user.list.groups'

GROUPS_OUTPUT=$(bash -c 'source this; source user; user.list.groups 2>/dev/null')
if [ -n "$GROUPS_OUTPUT" ]; then
  expect.pass "user.list.groups returned groups"
else
  expect.fail "user.list.groups should return at least one group"
fi

# ============================================================================
# T6: user.get.current.identity returns SSH dir
# ============================================================================
test.case $level "user.get.current.identity returns SSH dir" \
  bash -c 'source this; source ossh; source user; user.get.current.identity'

IDENTITY_OUTPUT=$(bash -c 'source this; source ossh; source user; user.get.current.identity 2>/dev/null')
if [ -n "$IDENTITY_OUTPUT" ]; then
  if [ -d "$IDENTITY_OUTPUT" ]; then
    expect.pass "user.get.current.identity returned valid dir: $IDENTITY_OUTPUT"
  else
    expect.fail "user.get.current.identity returned non-existent dir: $IDENTITY_OUTPUT"
  fi
else
  expect.fail "user.get.current.identity should return a path"
fi

# ============================================================================
# T7: user.ssh.status returns 0 when SSH is configured
# ============================================================================
test.case $level "user.ssh.status returns 0 when SSH configured" \
  bash -c 'source this; source ossh; source user; user.ssh.status'

bash -c 'source this; source ossh; source user; user.ssh.status 2>/dev/null'
SSH_RC=$?
if [ -d "$HOME/.ssh" ]; then
  if [ $SSH_RC -eq 0 ]; then
    expect.pass "user.ssh.status returns 0 (SSH configured)"
  else
    expect.fail "user.ssh.status should return 0 when ~/.ssh exists (got $SSH_RC)"
  fi
else
  if [ $SSH_RC -ne 0 ]; then
    expect.pass "user.ssh.status returns non-zero (no ~/.ssh)"
  else
    expect.fail "user.ssh.status should return non-zero when ~/.ssh missing"
  fi
fi

# ============================================================================
# T8: user.id.completion returns valid options
# ============================================================================
test.case $level "user.id.completion returns options" \
  bash -c 'source this; source user; user.id.completion'

COMP_OUTPUT=$(bash -c 'source this; source user; user.id.completion 2>/dev/null')
if echo "$COMP_OUTPUT" | grep -q '\-u'; then
  expect.pass "user.id.completion includes -u flag"
else
  expect.fail "user.id.completion should include -u flag"
fi

# ============================================================================
# T9: user.list filters underscore-prefixed users
# ============================================================================
test.case $level "user.list filters _ prefixed system users" \
  bash -c 'source this; source user; user.list'

FILTERED=$(bash -c 'source this; source user; user.list 2>/dev/null' | grep '^_' || true)
if [ -z "$FILTERED" ]; then
  expect.pass "user.list correctly filters _ prefixed users"
else
  expect.fail "user.list should not contain _ prefixed users, found: $(echo "$FILTERED" | head -1)"
fi

echo ""
echo "test.user complete"
