#ifndef LUCENE_WRAPPER_H
#define LUCENE_WRAPPER_H

#include "fts-api-private.h"
#include "guid.h"

struct mailbox_list;
struct fts_expunge_log;
struct fts_lucene_settings;

#define MAILBOX_GUID_HEX_LENGTH (GUID_128_SIZE*2)

struct lucene_index_record {
	guid_128_t mailbox_guid;
	uint32_t uid, part_num;
};

HASH_TABLE_DEFINE_TYPE(wguid_result, wchar_t *, struct fts_result *);

struct lucene_index *
lucene_index_init(const char *path, struct mailbox_list *list,
		  const struct fts_lucene_settings *set)
	ATTR_NULL(2, 3);
void lucene_index_deinit(struct lucene_index *index);

void lucene_index_select_mailbox(struct lucene_index *index,
				 const wchar_t guid[MAILBOX_GUID_HEX_LENGTH]);
void lucene_index_unselect_mailbox(struct lucene_index *index);
int lucene_index_get_last_uid(struct lucene_index *index, uint32_t *last_uid_r);
int lucene_index_get_doc_count(struct lucene_index *index, uint32_t *count_r);

int lucene_index_build_init(struct lucene_index *index);
int lucene_index_build_more(struct lucene_index *index, uint32_t uid,
			    uint32_t part_num, const unsigned char *data,
			    size_t size, const char *hdr_name);
int lucene_index_build_deinit(struct lucene_index *index);

void lucene_index_close(struct lucene_index *index);
int lucene_index_rescan(struct lucene_index *index);
int lucene_index_expunge_from_log(struct lucene_index *index,
				  struct fts_expunge_log *log);
int lucene_index_optimize(struct lucene_index *index);

int lucene_index_lookup(struct lucene_index *index, 
			struct mail_search_arg *args,
			enum fts_lookup_flags flags,
			struct fts_result *result);

int lucene_index_lookup_multi(struct lucene_index *index,
			      HASH_TABLE_TYPE(wguid_result) guids,
			      struct mail_search_arg *args,
			      enum fts_lookup_flags flags,
			      struct fts_multi_result *result);

struct lucene_index_iter *
lucene_index_iter_init(struct lucene_index *index);
const struct lucene_index_record *
lucene_index_iter_next(struct lucene_index_iter *iter);
int lucene_index_iter_deinit(struct lucene_index_iter **iter);

/* internal: */
void lucene_utf8_n_to_tchar(const unsigned char *src, size_t srcsize,
			    wchar_t *dest, size_t destsize);

void lucene_shutdown(void);

#endif
