getInputs(); $name = isset( $inputs['restaurant_name'] ) ? "`{$inputs['restaurant_name']}`" : '(unnamed)'; $address = $inputs['location'] ?? ''; $summary = "Create location {$name}"; if ( $address ) { $summary .= " at {$address}"; } return $summary; } /** * Human-readable version of tool inputs for the approval card. * * @return array */ public function get_approval_inputs(): array { return $this->getInputs(); } /** * Execute the tool * * @param string $restaurant_name Location name. * @param string $location Address. * @param bool|null $enable_pickup Whether pickup is enabled. * @param bool|null $enable_delivery Whether delivery is enabled. * @param float|null $delivery_fee Delivery fee amount. * @param int|null $reservation_minimum_guest Minimum reservation guests. * @param int|null $reservation_maximum_guest Maximum reservation guests. * @return array */ public function __invoke( string $restaurant_name, string $location, ?bool $enable_pickup = null, ?bool $enable_delivery = null, ?float $delivery_fee = null, ?int $reservation_minimum_guest = null, ?int $reservation_maximum_guest = null ): array { $check = $this->guard( 'manage_options' ); if ( $check ) { return $check; } if ( empty( trim( $restaurant_name ) ) ) { return [ 'error' => 'restaurant_name is required.' ]; } if ( empty( trim( $location ) ) ) { return [ 'error' => 'location address is required.' ]; } try { $body = [ 'restaurant_name' => sanitize_text_field( $restaurant_name ), 'location' => sanitize_text_field( $location ), ]; if ( null !== $enable_pickup ) { $body['enable_pickup'] = $enable_pickup; } if ( null !== $enable_delivery ) { $body['enable_delivery'] = $enable_delivery; } if ( null !== $delivery_fee ) { $body['delivery_fee'] = max( 0.0, $delivery_fee ); } if ( null !== $reservation_minimum_guest ) { $body['reservation_minimum_guest'] = max( 1, $reservation_minimum_guest ); } if ( null !== $reservation_maximum_guest ) { $body['reservation_maximum_guest'] = max( 1, $reservation_maximum_guest ); } if ( isset( $body['reservation_minimum_guest'], $body['reservation_maximum_guest'] ) && $body['reservation_minimum_guest'] > $body['reservation_maximum_guest'] ) { return [ 'error' => 'reservation_minimum_guest cannot exceed reservation_maximum_guest.' ]; } $json = wp_json_encode( $body ); if ( false === $json ) { Log::error( 'Wpcafe_Create_Location_Tool JSON encoding failed', [ 'body_keys' => array_keys( $body ) ] ); return [ 'error' => 'Failed to encode request data. Ensure all input values are valid text.' ]; } $request = new \WP_REST_Request( 'POST', '/wpcafe/v2/locations' ); $request->set_header( 'content-type', 'application/json' ); $request->set_body( $json ); $controller = new \WpCafe\Location\Controllers\Location_Controller(); $response = $controller->create_item( $request ); // Write-specific unwrapper: create_item() returns a raw Model, not a Resource array. $data = $this->extract_write_result( $response, 'Failed to create location.' ); if ( isset( $data['error'] ) ) { return $data; } $id = (int) ( $data['id'] ?? 0 ); $result = [ 'success' => true, 'name' => $restaurant_name, 'message' => "Location \"{$restaurant_name}\" created successfully.", ]; if ( $id > 0 ) { $result['location_id'] = $id; $result['message'] = "Location \"{$restaurant_name}\" created successfully (ID: {$id})."; } return $result; } catch ( \Throwable $e ) { Log::error( 'Wpcafe_Create_Location_Tool error', [ 'error' => $e->getMessage() ] ); return [ 'error' => 'Failed to create location: ' . $e->getMessage() ]; } } }