#import <Foundation/Foundation.h>
#import "Template.h"
#import "RawSample.h"

/**
	@defgroup SwiftAPI
	@{
*/

/** \~English
	\brief Result of template matching.
	\~Russian
	\brief Результат сравнения шаблонов.
*/
@interface MatchResult : NSObject
{
    void *match_result;
    
    double distance;
    double fa_r;
    double fr_r;
    double score;
}
-(nonnull instancetype) init: (void* _Nonnull) match;
-(void) dealloc;

/** \~English
	\brief Distance between the templates.
	\~Russian
	\brief Расстояние между шаблонами.
*/
@property (readonly) double distance;

/** \~English
	\brief
		False acceptance rate corresponding to the distance value taken as a threshold
		at the extended LFW test (Labeled Faces in the Wild http://vis-www.cs.umass.edu/lfw/).
	\~Russian
	\brief
		Значение FAR (false acceptance rate), соответствующее расстоянию distance, взятому в качестве порога
		на расширенном LFW-тесте (Labeled Faces in the Wild http://vis-www.cs.umass.edu/lfw/).
*/
@property (readonly) double fa_r;

/** \~English
	\brief
		False rejection rate corresponding to the distance value taken as a threshold
		at the extended LFW test (Labeled Faces in the Wild http://vis-www.cs.umass.edu/lfw/).
	\~Russian
	\brief
		Значение FRR (false rejection rate), соответствующее расстоянию distance, взятому в качестве порога
		на расширенном LFW тесте (Labeled Faces in the Wild http://vis-www.cs.umass.edu/lfw/).
*/
@property (readonly) double fr_r;

/** \~English
	\brief Score of templates similarity - real number from 0 to 1.
	\~Russian
	\brief Величина сходства шаблонов - действительное число от 0 до 1.
*/
@property (readonly) double score;
@end

@interface Recognizer : NSObject
{
    void *recognizer;
}
-(nonnull instancetype) init: (void* _Nonnull) reco;
-(void) dealloc;

/**
	\~English
	\brief
		Load the template.
		The format is platform-independent.
		Only the templates that were created with the same method
		(i.e. with the same ini_file) can be loaded.

	\param[in] data
		Data buffer.

	\param[in] size
		Number of bytes in the data buffer.

	\return
		Loaded template.

	\~Russian
	\brief
		Загрузить шаблон.
		Формат платформонезависимый.
		Загружать можно только шаблоны, созданные этим же методом
		(т.е. с таким же конфигурационным файлом).

	\param[in] data
		Буфер данных.

	\param[in] size
		Размер буфера (в байтах).

	\return
		Загруженный шаблон.
*/
-(nonnull Template *) loadTemplate: (const void* _Nonnull const) data : (const int) size;

/**
	\~English
	\brief
		Load the template.
		The format is platform-independent.
		Only the templates that were created with the same method
		(i.e. with the same ini_file) can be loaded.

	\param[in] file_path
	\return
		Loaded template.

	\~Russian
	\brief
		Загрузить шаблон.
		Формат платформонезависимый.
		Загружать можно только шаблоны, созданные этим же методом
		(т.е. с таким же конфигурационным файлом).

	\param[in] file_path
	\return
		Загруженный шаблон.
*/
-(nonnull Template*) loadTemplate:(const char* _Nullable)file_path;

/**
	\~English
	\brief
		Get a point on the ROC curve with a given false acceptance rate (FAR).
		Thread-safe.

	\return
		Point on the ROC curve in the form of a MatchResult struct.

	\~Russian
	\brief
		Получить точку на ROC-кривой с заданным false acceptance rate (FAR).
		Потокобезопасный.

	\return
		Точка на ROC-кривой в виде структуры MatchResult.
*/
-(nonnull MatchResult *) getROCCurvePointByFAR: (const double) desired_far;

/**
	\~English
	\brief
		Create a template.

	\param[in]  raw_sample
		Face sample.
		At the moment, all methods can only be used with frontal samples.

	\return
		Created template.

	\~Russian
	\brief
		Создать шаблон.

	\param[in]  raw_sample
		Образец лица.
		На данный момент все методы могут работать только с фронтальными образцами.

	\return
		Созданный шаблон.
*/
-(nonnull Template *) processing: (RawSample *_Nullable)raw_sample;

@end

/** @} */

