#ifndef __VEREIGN_GRPC_PASSPORT_API_HH
#define __VEREIGN_GRPC_PASSPORT_API_HH

#include <vereign/grpc/gen/passport_api.hh>

namespace vereign {
namespace grpc {

template <class VereignService>
class PassportAPI final : public gen::PassportAPI<VereignService> {
public:
  using VereignServicePtr = std::unique_ptr<VereignService>;

  PassportAPI(VereignServicePtr&& service)
    : gen::PassportAPI<VereignService>{std::move(service)}
  {}

  PassportAPI(const PassportAPI&) = delete;
  PassportAPI& operator=(const PassportAPI&) = delete;

  ::grpc::Status ListPassportsManually(
    ::grpc::ServerContext*,
    const client_library::ListPassportsForm* request,
    client_library::ListPassportsFormResponse* response
  ) override {
    auto result_future = this->service_->ListPassports(request, response);

    try {
      result_future.get();
    } catch (const std::exception& e) {
      response->set_code("500");
      response->set_status("Internal Service Error");
      response->set_error(e.what());
    } catch (...) {
      response->set_code("500");
      response->set_status("Internal Service Error");
      response->set_error("Internal Service Error");
    }

    return ::grpc::Status::OK;
  }
};

} // namespace grpc
} // namespace vereign

#endif // __VEREIGN_GRPC_PASSPORT_API_HH