function cmd::unblock::run() {
  local name=""
  local type=""
  local ips=()
  local subnets=()
  local ports=()
  local all=false
  local quiet=false

  while [[ $# -gt 0 ]]; do
    case "$1" in
      --name)   name="$2";          shift 2 ;;
      --type)   type="$2";          shift 2 ;;
      --ip)     ips+=("$2");        shift 2 ;;
      --force)  force=true;         shift   ;;
      --quiet)  quiet=true;         shift   ;;
      --subnet) subnets+=("$2");    shift 2 ;;
      --port)   ports+=("$2");      shift 2 ;;
      --all)    all=true;           shift   ;;
      --help)   cmd::unblock::help; return  ;;
      *)
        log::error "Unknown flag: $1"
        cmd::unblock::help
        return 1
        ;;
    esac
  done

  if [[ -z "$name" ]]; then
    log::error "Missing required flag: --name"
    cmd::unblock::help
    return 1
  fi

  name=$(peers::resolve_and_require "$name" "$type") || return 1

  # Check if actually blocked
  if ! peers::is_blocked "$name" && ! block::has_file "$name"; then
    log::wg_warning "Client is not blocked: ${name}"
    return 0
  fi

  # Default to full unblock if no specific flags given
  if [[ ${#ips[@]} -eq 0 && ${#subnets[@]} -eq 0 && ${#ports[@]} -eq 0 ]]; then
    all=true
  fi

  local client_ip
  client_ip=$(peers::get_ip "$name") || return 1

  # $quiet || log::section "Unblocking client: ${name} (${client_ip})"

  if $all; then
    cmd::unblock::_unblock_all "$name" "$client_ip" "$quiet"
    return 0
  fi

  # Unblock specific IPs
  for ip in "${ips[@]}"; do
    fw::unblock_ip "$client_ip" "$ip"
    block::remove_rule "$name" "ip" "$ip"
  done

  # Unblock specific subnets
  for subnet in "${subnets[@]}"; do
    fw::unblock_subnet "$client_ip" "$subnet"
  done

  # Unblock specific ports
  for entry in "${ports[@]}"; do
    local target port proto
    IFS=":" read -r target port proto <<< "$entry"
    proto="${proto:-tcp}"
    fw::unblock_port "$client_ip" "$target" "$port" "$proto"
  done

  $quiet || log::wg_success "Unblock rules applied for: ${name}"

  return 0
}