#import <Foundation/Foundation.h>
#import "RawImage.h"
#import "Point.h"

/**
	@defgroup SwiftAPI
	@{
*/

/** \~English
	\brief Sample types (see also Capturer::CapturerType).
	\~Russian
	\brief Типы образцов (см. также Capturer::CapturerType).
*/
typedef  NS_ENUM(int32_t, SampleType){
	/** \~English
		\brief The face is frontal-oriented.
		\~Russian
		\brief Фронтальное лицо.
	*/
	SAMPLE_TYPE_FRONTAL = 0,

	/** \~English
		\brief The face is left-profile-oriented.
		\~Russian
		\brief Лицо в профиль, смотрящее влево.
	*/
	SAMPLE_TYPE_LEFT_PROFILE = 1,

	/** \~English
		\brief The face is right-profile-oriented.
		\~Russian
		\brief Лицо в профиль, смотрящее вправо.
	*/
	SAMPLE_TYPE_RIGHT_PROFILE = 2,
};

/**  \~English
	\brief Image formats for saving.
	\~Russian
	\brief Форматы изображения для сохранения (сериализации).
*/
typedef  NS_ENUM(int32_t, ImageFromat){
	/** \~English
		\brief JPEG (lossy compression).
		\~Russian
		\brief JPEG (сжатие с потерями).
	*/
	IMAGE_FORMAT_JPG = 0,

	/** \~English
		\brief PNG (lossless compression).
		\~Russian
		\brief PNG (сжатие без потерь).
	*/
	IMAGE_FORMAT_PNG = 1,

	/** \~English
		\brief TIFF (lossless compression).
		\~Russian
		\brief TIFF (сжатие без потерь).
	*/
	IMAGE_FORMAT_TIF = 2,

	/** \~English
		\brief BMP (no compression).
		\~Russian
		\brief BMP (без сжатия).
	*/
	IMAGE_FORMAT_BMP = 3,
};

/** \~English
	\brief Face cropping types.
	\~Russian
	\brief Типы обрезки лица.
*/
typedef  NS_ENUM(int32_t, FaceCutType){
	FACE_CUT_BASE = 0,
	FACE_CUT_FULL_FRONTAL = 1,
	FACE_CUT_TOKEN_FRONTAL = 2,
};

/** \~English
	\brief Face orientation angles.
	\~Russian
	\brief Углы ориентации лица.
*/
@interface Angles : NSObject
{
    float yaw;
    float pitch;
    float roll;
}

-(nonnull instancetype) init: (float) yaw : (float) pitch : (float) roll;

/** \~English
	\brief Yaw angle in degrees.
	\~Russian
	\brief Угол поворота вокруг вертикальной оси в градусах.
*/
@property float yaw;

/** \~English
	\brief Pitch angle in degrees.
	\~Russian
	\brief Угол поворота вокруг горизонтальной оси в градусах.
*/
@property float pitch;

/** \~English
	\brief Roll angle in degrees.
	\~Russian
	\brief Угол поворота в картинной плоскости в градусах.
*/
@property float roll;
@end

/** \~English
	\brief Interface object that stores a captured face sample.
	\~Russian
	\brief Интерфейсный объект, хранящий образец лица.
*/
@interface RawSample : NSObject
{
    void *raw_sample;
}
-(nonnull instancetype)init: (void* _Nonnull) sample;
-(void) dealloc;

/**
	\~English
	\brief
		Get a face bounding rectangle. Thread-safe.

	\return
		Rectangle bounding face on the original image.

	\~Russian
	\brief
		Получить ограничивающий прямоугольник лица. Потокобезопасный.

	\return
		Прямоугольник, ограничивающий лицо на оригинальном изображении.
*/
-(nonnull Rectangle *) getRectangle;

/**
	\~English
	\brief
		Get anthropometric landmarks. Only frontal samples. Thread-safe.

	\return
		The vector of anthropometric points in the original image.

	\~Russian
	\brief
		Получить антропометрические точки лица. Только для фронтальных образцов. Потокобезопасный.

	\return
		Вектор позиций антропометрических точек на оригинальном изображении.
*/
-(nonnull NSMutableArray *) getLandmarks;

/**
	\~English
	\brief
		Get a point of the left eye. Only frontal samples. Thread-safe.

	\return
		Point of the left eye.

	\~Russian
	\brief
		Получить позицию левого глаза. Только для фронтальных образцов. Потокобезопасный.

	\return
		Позиция левого глаза на оригинальном изображении.
*/
-(nonnull Point2 *) getLeftEye;

/**
	\~English
	\brief
		Get a point of the right eye. Only frontal samples. Thread-safe.

	\return
		Point of the right eye.

	\~Russian
	\brief
		Получить позицию правого глаза. Только для фронтальных образцов. Потокобезопасный.

	\return
		Позиция правого глаза на оригинальном изображении.
*/
-(nonnull Point2 *) getRightEye;

/**
	\~English
	\brief
		Get a face orientation. Only frontal samples. Thread-safe.

	\return
		Face orientation angles in degrees.

	\~Russian
	\brief
		Получить углы ориентации лица. Только для фронтальных образцов. Потокобезопасный.

	\return
		Углы ориентации лица.
*/
-(nonnull Angles *) getAngles;

/**
	\~English
	\brief
		Get a face ID. Thread-safe.

	\return
		- A non-negative track id, if this sample was captured by a tracker, or
		- Any meaningless negative value, otherwise.

	\~Russian
	\brief
		Получить целочисленный идентификатор. Потокобезопасный.

	\return
		- Неотрицательное число, если образец был получен с помощью трекера, или
		- Любое отрицательное число в противном случае.
*/
-(int) getID;

/**
	\~English
	\brief
		Get an ID of the frame, in which this RawSample is detected
		(for samples made with VideoWorker). Thread-safe.

	\return
		Zero if this RawSample was made not with VideoWorker,
		\n
		otherwise it's a nonnegative integer - id (that was returned
		by the VideoWorker::addVideoFrame) of the frame,
		in which this RawSample is detected.

	\~Russian
	\brief
		Получить ID кадра, на котором был обнаружен образец
		(для образцов, полученных с помощью VideoWorker). Потокобезопасный.

	\return
		Ноль, если образец был получен не через VideoWorker,
		\n
		иначе - неотрицательное целое число -
		идентификатор (который был возвращен методом VideoWorker::addVideoFrame)
		кадра, на котором был обнаружен образец.
*/
-(int) getFrameID;

/**
	\~English
	\brief
		Does the sample store the original image
		(true for samples made with VideoWorker with enabled store_original_frame_in_raw_sample).
		Thread-safe.

	\return
		true, if it has original image, otherwise false.

	\~Russian
	\brief
		Хранит ли образец оригинальное изображение, с которого он был получен
		(true для образцов, полученных с помощью VideoWorker с включенным
		параметром store_original_frame_in_raw_sample).
		Потокобезопасный.

	\return
		true, если содержит, иначе false.
*/
-(bool) hasOriginalImage;

/**
	\~English
	\brief
		Get a sample type. Thread-safe.

	\return
		Type of the sample.

	\~Russian
	\brief
		Получить тип образца. Потокобезопасный.

	\return
		Тип образца.
*/
-(SampleType) getType;

/**
	\~English
	\brief
		Crop face in RawImage format (with raw pixels). Thread-safe.

	\param[in]  color_model
		Image color model.

	\param[in]  cut_type
		Face cropping types.

	\return  RawImage with cropped face

	\~Russian
	\brief
		Обрезать лицо и выдать в формате RawImage (с декодированными пикселями). Потокобезопасный.

	\param[in]  color_model
		Цветовая модель изображения.

	\param[in]  cut_type
		Тип обрезки.

	\return  RawImage c кропом лица
*/
-(nonnull RawImage *) cutFaceRawImage;

/**
	\~English
	\brief
		Save (serialize) the sample.
		Original image will not be saved
		(i.e. only the part of an image containing the face is saved).
		The format is platform-independent.
		Thread-safe.

	\param[out]  file_path

	\~Russian
	\brief
		Сохранить (сериализовать) образец.
		Оригинальное изображение не сохраняется.
		(т.е. сохраняется только часть изображения, содержащая лицо).
		Формат платформонезависимый.
		Потокобезопасный.

	\param[out]  file_path

*/
-(void) save: (const char*_Nullable) file_path;

/**
	\~English
	\brief
		Get a cropping rectangle (for preview) that will be used in cutFaceImage. Thread-safe.

	\return
		4 points that are corners of a rectangle in the counterclockwise order starting from the upper left corner.

	\param[in]  cut_type
		Face cropping types.

	\~Russian
	\brief
		Получить прямоугольник (для предпросмотра обрезки). Потокобезопасный.

	\return
		4 точки - углы прямоугольника в порядке против часовой стрелки, начиная с левого верхнего угла.

	\param[in]  cut_type
		Тип обрезки.
*/
-(nonnull NSMutableArray *) getFaceCutRectangle: (FaceCutType) cut_type;


@property (readonly, nonnull) void* raw_sample;
@end

/** @} */