// Licensed 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 ERLFDB_RESOURCES_H
#define ERLFDB_RESOURCES_H

#include <stdbool.h>

#include "erl_nif.h"
#include "fdb.h"


extern ErlNifResourceType* ErlFDBFutureRes;
extern ErlNifResourceType* ErlFDBDatabaseRes;
extern ErlNifResourceType* ErlFDBTransactionRes;


typedef enum _ErlFDBFutureType
{
    ErlFDB_FT_NONE = 0,
    ErlFDB_FT_VOID,
    ErlFDB_FT_VERSION,
    ErlFDB_FT_KEY,
    ErlFDB_FT_VALUE,
    ErlFDB_FT_STRING_ARRAY,
    ErlFDB_FT_KEYVALUE_ARRAY
} ErlFDBFutureType;


typedef struct _ErlFDBFuture
{
    FDBFuture* future;
    ErlFDBFutureType ftype;
    ErlNifPid pid;
    ErlNifEnv* pid_env;
    ErlNifEnv* msg_env;
    ERL_NIF_TERM msg_ref;
    bool cancelled;
} ErlFDBFuture;


typedef struct _ErlFDBDatabase
{
    FDBDatabase* database;
} ErlFDBDatabase;


typedef struct _ErlFDBTransaction
{
    FDBTransaction* transaction;
    ERL_NIF_TERM owner;
    unsigned int txid;
    bool read_only;
} ErlFDBTransaction;


int erlfdb_init_resources(ErlNifEnv* env);
void erlfdb_future_dtor(ErlNifEnv* env, void* obj);
void erlfdb_database_dtor(ErlNifEnv* env, void* obj);
void erlfdb_transaction_dtor(ErlNifEnv* env, void* obj);


int erlfdb_transaction_is_owner(ErlNifEnv* env, ErlFDBTransaction* t);


#endif // Included resources.h
