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

#include "retainable.h"

#ifdef SWIG
%feature("director", assumeoverride=1) CrashReporterFfi;
#endif

class CrashReporterFfi: public Retainable {
public:
  virtual ~CrashReporterFfi() {}

  static void ffiInvokeReportCrashKotlinImplementation(
    void *ctx,
    dittoffi_panic_t *panic
  ) {
    auto inst = (CrashReporterFfi *)ctx;
    return inst->reportCrashKotlinImplementation(panic);
  }

  virtual void reportCrashKotlinImplementation(
    dittoffi_panic_t *panic
  ) = 0;

  virtual void overrideCrashReporter(
    struct CDitto *ditto_raw
  ) {
    CrashReporterFfi * handler = this;

    dittoffi_panic_handler_t ffiPanicHandler;
    handler->java_retain();
    ffiPanicHandler.env_ptr = handler;
    ffiPanicHandler.call = CrashReporterFfi::ffiInvokeReportCrashKotlinImplementation;
    ffiPanicHandler.free = CrashReporterFfi::invokeRelease;

    dittoffi_ditto_set_panic_handler(ffiPanicHandler);
  }
};
