#!/usr/bin/env bash
set -Eeuo pipefail

SCRIPT_NAME="$(basename "$0")"
STRICT=0

usage() {
    cat <<'EOF'
Usage: tool-check.sh [options]

Read-only workstation checks for PenWebTools lab setups.

Options:
  --strict    Exit non-zero when required commands are missing.
  -h, --help  Show this help.
EOF
}

while (( $# > 0 )); do
    case "$1" in
        --strict) STRICT=1 ;;
        -h|--help)
            usage
            exit 0
            ;;
        *) echo "Unknown option: $1" >&2; exit 2 ;;
    esac
    shift
done

REQUIRED=(bash awk grep sed mktemp sha256sum)
RECOMMENDED=(sudo git zsh tmux nmap ffuf feroxbuster gobuster jq rg fzf openvpn wg curl wget)
missing_required=0

section() {
    printf '\n== %s ==\n' "$1"
}

check_command() {
    local name="$1"
    if command -v "$name" >/dev/null 2>&1; then
        printf 'OK      %-18s %s\n' "$name" "$(command -v "$name")"
    else
        printf 'MISSING %-18s\n' "$name"
        return 1
    fi
}

section System
date -Is 2>/dev/null || date
uname -a
[[ -r /etc/os-release ]] && . /etc/os-release && printf 'OS: %s\n' "${PRETTY_NAME:-unknown}"
printf 'User: %s\n' "$(id -un 2>/dev/null || printf unknown)"
printf 'Shell: %s\n' "${SHELL:-unknown}"
printf 'PATH: %s\n' "$PATH"

section "Required commands"
for cmd in "${REQUIRED[@]}"; do
    check_command "$cmd" || missing_required=1
done
if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then
    printf 'MISSING curl or wget\n'
    missing_required=1
fi

section "Recommended commands"
for cmd in "${RECOMMENDED[@]}"; do
    check_command "$cmd" || true
done

section "Files and directories"
for path in "$HOME/.zshrc" "$HOME/.bashrc" "$HOME/.tmux.conf" "$HOME/tools" "$HOME/engagements" /usr/share/seclists /usr/share/wordlists/rockyou.txt; do
    if [[ -e "$path" ]]; then
        printf 'OK      %s\n' "$path"
    else
        printf 'MISSING %s\n' "$path"
    fi
done

section "VPN interfaces"
if command -v ip >/dev/null 2>&1; then
    ip -brief address show 2>/dev/null | awk '$1 ~ /^(tun|wg)/ { print }' || true
else
    printf 'ip command unavailable\n'
fi

if (( STRICT == 1 && missing_required == 1 )); then
    exit 1
fi
