extern "C" {
#include "dittoffi.h"
}

#include "retainable.h"

#ifdef SWIG
%feature("director", assumeoverride=1) LiveQueryHandlerRust;
%apply(char *STRING, size_t LENGTH) { (const unsigned char *query_args_cbor, uintptr_t query_args_cbor_len) };
#endif
class LiveQueryHandlerRust: public Retainable {
public:
  virtual ~LiveQueryHandlerRust() {}

  virtual void eventHandler(
    c_cb_params_t c_cb_params
  ) = 0;

  static void invokeEventHandler(
    void *ctx,
    c_cb_params_t c_cb_params
  ) {
    auto inst = static_cast<LiveQueryHandlerRust*>(ctx);
    return inst->eventHandler(c_cb_params);
  }

  virtual I64Result_t registerLiveQuery(
    struct CDitto *ditto_raw,
    const char *coll_name,
    const char *query,
    const unsigned char *query_args_cbor,
    uintptr_t query_args_cbor_len,
    COrderByParam_t const *order_by,
    unsigned int order_by_len,
    int limit,
    unsigned int offset,
    LiveQueryAvailability_t lq_availability
  ) {
    return ditto_live_query_register_str(
      ditto_raw,
      coll_name,
      query,
      slice_ref_uint8_t {
        .ptr = (uint8_t const *)query_args_cbor,
        .len = query_args_cbor_len,
      },
      slice_ref_COrderByParam_t {
        .ptr = order_by,
        .len = order_by_len,
      },
      limit,
      offset,
      lq_availability,
      this,
      LiveQueryHandlerRust::invokeRetain,
      LiveQueryHandlerRust::invokeRelease,
      LiveQueryHandlerRust::invokeEventHandler
    );
  }

  virtual int startLiveQuery(struct CDitto *ditto_raw, int64_t id) {
    return ditto_live_query_start(ditto_raw, id);
  }
};
