function cmd::inspect::_blocks_info() {
  local name="${1:-}"
  block::has_file "$name" || return 0

  local blocked_direct 
  blocked_direct=$(block::is_blocked_direct "$name")

  local blocked_groups 
  blocked_groups=$(block::get_groups "$name")
  
  local rules_output
  rules_output=$(block::get_rules "$name")

  # Skip if truly empty
  if [[ "$blocked_direct" != "true" ]] && \
     ui::empty "$blocked_groups" && \
     ui::empty "$rules_output"; then
    block::cleanup "$name"  # clean up stale empty file
    return 0
  fi

  # Count rules for header
  local rule_count=0
  while IFS= read -r line; do
    [[ -n "$line" ]] && (( rule_count++ )) || true
  done <<< "$rules_output"

  # Build header like firewall: Blocks (+N)
  local header_counts=""
  [[ "$rule_count" -gt 0 ]] && header_counts=" (${rule_count})"
  [[ "$blocked_direct" == "true" || -n "$blocked_groups" ]] && \
    header_counts="${header_counts} 🚫"

  cmd::inspect::_section "Blocks${header_counts}"
  printf "\n"

  [[ "$blocked_direct" == "true" ]] && \
    printf "    \033[1;31m🚫\033[0m blocked directly\n"
  [[ -n "$blocked_groups" ]] && \
    printf "    \033[1;31m🚫\033[0m blocked by groups: %s\n" "$blocked_groups"

  block::format_rules "$name"
  return 0
}
function cmd::inspect::_firewall_info() {
  local name="${1:-}"
  local ip
  ip=$(peers::get_ip "$name")

  local total=0 accepts=0 drops=0
  local rules_output=()
  while IFS= read -r line; do
    [[ -z "$line" ]] && continue
    (( total++ )) || true
    [[ "$line" =~ ACCEPT ]] && (( accepts++ )) || true
    [[ "$line" =~ DROP   ]] && (( drops++   )) || true
    rules_output+=("$line")
  done < <(fw::forward_rules_for_ip "$ip" | grep -v NFLOG)

  ui::empty "${rules_output[*]}" && return 0

  printf "\n  \033[0;37m── Firewall (%s %s) \033[0m%s\n\n" \
      "$(color::green "+${accepts}")" \
      "$(color::red "-${drops}")" \
      "$(printf '\033[0;37m─%.0s' {1..28})"

  fw::list_peer_rules "$ip" false

  return 0
}