# Create client config
  peers::create_client_config "$full_name" "$effective_type" "$ip" "$allowed_ips" || return 1

  # Store subtype in meta
  if [[ -n "$subtype" ]]; then
    peers::set_meta "$full_name" "subtype" "$subtype"
  fi

  # Add peer to server config
  local public_key
  public_key=$(keys::public "$full_name") || return 1
  peers::add_to_server "$full_name" "$public_key" "$ip" || return 1

  log::wg_add "Rule:   ${rule:-none}"

  # Apply presets
  for preset in "${presets[@]}"; do
    firewall::apply_preset "$preset" "${ip}" || return 1
  done

  # Apply rule
  if [[ -n "$rule" ]]; then
    rule::apply "$rule" "$ip" || return 1
  fi

  # Reload WireGuard
  peers::reload || return 1

  log::wg_success "Client added successfully: ${full_name} (${ip}) [${tunnel} tunnel]"
