#include <string>
#include <iostream>

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

#include "echo.grpc.pb.h"

using namespace std;
using namespace echo;
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;

class EchoClient {
public:
  EchoClient(shared_ptr<Channel> chan) : stub_(Echo::NewStub(chan)) {}

  Status DoEcho(const string& msg){
    EchoRequest req;
    req.set_message(msg);

    EchoRequest resp;

    ClientContext ctx;

    return stub_->DoEcho(&ctx, req, &resp);
  }

private:
  unique_ptr<Echo::Stub> stub_;
};

class AddClient {
public:
  AddClient(shared_ptr<Channel> chan) : stub_(Add::NewStub(chan)) {}

  AddResponse DoAdd(const uint32_t x, const uint32_t y){
    AddRequest msg;
    msg.set_addx(x);
    msg.set_addy(y);

    AddResponse resp;

    ClientContext ctx;

    stub_->DoAdd(&ctx, msg, &resp);

    return resp;
  }
private:
  unique_ptr<Add::Stub> stub_;
};

int main(){

  EchoClient client(grpc::CreateChannel("localhost:50051",
                                        grpc::InsecureChannelCredentials()));
  string msg("hi");
  /*
  while(true){
    Status status = client.DoEcho(msg);
    if(!status.ok()){
      cout<<"Error: "<<status.error_code()<<endl;
      return 1;
    }
  }
  */

  AddClient addClient (grpc::CreateChannel("localhost:50051",
                                        grpc::InsecureChannelCredentials()));
  AddResponse answer = addClient.DoAdd(1,2);
  cout<<"Got answer: "<<answer.answer()<<endl;
  return 0;
}