getInputs(); $name = isset( $inputs['name'] ) ? "`{$inputs['name']}`" : '(unknown)'; $date = $inputs['date'] ?? ''; $start = $inputs['start_time'] ?? ''; $end = $inputs['end_time'] ?? ''; $guests = $inputs['total_guest'] ?? '?'; $summary = "Create reservation for {$name}"; if ( $date ) { $summary .= " on {$date}"; } if ( $start && $end ) { $summary .= " {$start}–{$end}"; } if ( $guests ) { $summary .= ", {$guests} guest(s)"; } 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 $name Customer name. * @param string $email Customer email. * @param string $date Reservation date (Y-m-d). * @param string $start_time Start time (HH:MM). * @param string $end_time End time (HH:MM). * @param int $total_guest Guest count. * @param string|null $phone Phone number. * @param int|null $branch_id Branch/location ID. * @param string|null $notes Additional notes. * @param string|null $payment_method Payment method (local|wc). * @return array */ public function __invoke( string $name, string $email, string $date, string $start_time, string $end_time, int $total_guest, ?string $phone = null, ?int $branch_id = null, ?string $notes = null, ?string $payment_method = null ): array { $check = $this->guard( 'manage_woocommerce', 'manage_options', 'wpcafe_manage_reservations' ); if ( $check ) { return $check; } try { if ( empty( trim( $name ) ) ) { return [ 'error' => 'Customer name is required.' ]; } if ( ! is_email( $email ) ) { return [ 'error' => 'A valid customer email address is required.' ]; } $parsed_date = \DateTime::createFromFormat( 'Y-m-d', $date ); if ( ! $parsed_date || $parsed_date->format( 'Y-m-d' ) !== $date ) { return [ 'error' => 'date must be in Y-m-d format.' ]; } if ( ! preg_match( '/^(?:[01]\d|2[0-3]):[0-5]\d$/', $start_time ) ) { return [ 'error' => 'start_time must be a valid 24-hour time in HH:MM format (00:00-23:59).' ]; } if ( ! preg_match( '/^(?:[01]\d|2[0-3]):[0-5]\d$/', $end_time ) ) { return [ 'error' => 'end_time must be a valid 24-hour time in HH:MM format (00:00-23:59).' ]; } if ( $total_guest < 1 ) { return [ 'error' => 'total_guest must be at least 1.' ]; } if ( null !== $payment_method && ! in_array( $payment_method, [ 'local', 'wc' ], true ) ) { return [ 'error' => "Invalid payment_method '{$payment_method}'. Accepted values: local, wc." ]; } $body = [ 'name' => sanitize_text_field( $name ), 'email' => sanitize_email( $email ), 'date' => $date, 'start_time' => $start_time, 'end_time' => $end_time, 'total_guest' => $total_guest, ]; if ( null !== $phone ) { $body['phone'] = sanitize_text_field( $phone ); } if ( null !== $branch_id && $branch_id > 0 ) { $body['branch_id'] = $branch_id; } if ( null !== $notes ) { $body['notes'] = sanitize_textarea_field( $notes ); } if ( null !== $payment_method ) { $body['payment_method'] = $payment_method; } $json = wp_json_encode( $body ); if ( false === $json ) { Log::error( 'Wpcafe_Create_Reservation_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/reservations' ); $request->set_header( 'content-type', 'application/json' ); $request->set_body( $json ); $controller = new \WpCafe\Reservation\Controllers\Reservation_Controller(); $response = $controller->create_item( $request ); $data = $this->extract_response( $response, 'Failed to create reservation.' ); if ( isset( $data['error'] ) ) { return $data; } $id = $data['id'] ?? 0; return [ 'success' => true, 'reservation_id' => $id, 'invoice' => $data['invoice'] ?? '', 'status' => $data['status'] ?? 'pending', 'message' => "Reservation created successfully (ID: {$id}).", ]; } catch ( \Throwable $e ) { Log::error( 'Wpcafe_Create_Reservation_Tool error', [ 'error' => $e->getMessage() ] ); return [ 'error' => 'Failed to create reservation: ' . $e->getMessage() ]; } } }