/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 **/

#ifndef QUICKSTEP_CLI_SINGLE_NODE_CLIENT_HPP_
#define QUICKSTEP_CLI_SINGLE_NODE_CLIENT_HPP_

#include <grpc++/grpc++.h>

#include <iostream>
#include <memory>
#include <string>
#include <vector>

#include "cli/NetworkCli.grpc.pb.h"
#include "cli/NetworkCli.pb.h"
#include "utility/Macros.hpp"

#include "gflags/gflags.h"
#include "glog/logging.h"

using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;

namespace quickstep {

/**
 * A simple wrapper class used to do CLI interactions with QuickstepCLI via the gRPC interface.
 */
class NetworkCliClient {
 public:
  explicit NetworkCliClient(const std::shared_ptr<Channel> &channel)
      : stub_(NetworkCli::NewStub(channel)) {}

  /**
   * Assembles the client's payload, sends it and presents the response back from the server.
   * @param user_query A SQL statement or command to be executed on the server.
   * @return The text of the server's response.
   */
  std::string Query(const std::string &user_query) {
    QueryRequest request;
    request.set_query(user_query);
    QueryResponse response;

    Status status = SendQuery(request, &response);

    if (status.ok()) {
      return HandleQueryResponse(response);
    } else {
      LOG(WARNING) << "RPC call failed with code " << status.error_code()
                   << " and message: " << status.error_message();
      return "RPC failed";
    }
  }

  Status SendQuery(const QueryRequest& request, QueryResponse* response) {
    ClientContext context;
    return stub_->SendQuery(&context, request, response);
  }

 private:
  /**
   * Handle a valid response from the server.
   * @param response A valid query response.
   * @return The response string.
   */
  std::string HandleQueryResponse(QueryResponse const &response) const {
    return response.query_result() + response.error_result();
  }

  std::unique_ptr<NetworkCli::Stub> stub_;

  DISALLOW_COPY_AND_ASSIGN(NetworkCliClient);
};

}  // namespace quickstep

#endif  // QUICKSTEP_CLI_SINGLE_NODE_CLIENT_HPP_
