#ifndef ANSODENGINE_H
#define ANSODENGINE_H
#define ANSODENGINE_API __declspec(dllexport)

#pragma once
#include "ANSEngineCommon.h"
#include "LabVIEWHeader/extcode.h"

extern "C" ANSODENGINE_API std::string  CreateANSODHandle(ANSCENTER::ANSODBase** Handle,
															const char* licenseKey,
															const char* modelFilePath,
															const char* modelFileZipPassword,
															float detectionScoreThreshold,
															float modelConfThreshold,
															float modelMNSThreshold,
															int autoDetectEngine,
															int modelType,
															int detectionType, int loadEngineOnCreation=1);
extern "C" ANSODENGINE_API std::string  RunInference(ANSCENTER::ANSODBase * *Handle, unsigned char* jpeg_string, unsigned int bufferLength);
extern "C" ANSODENGINE_API std::string  RunTiledInference(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, int tiledWidth, int titledHeight, double overlap, const char* cameraId);
extern "C" ANSODENGINE_API std::string  RunInferenceFromJpegString(ANSCENTER::ANSODBase** Handle, const char* jpeg_string, unsigned long jpeg_size, const char* cameraId);
extern "C" ANSODENGINE_API std::string  RunTiledInferenceFromJpegString(ANSCENTER::ANSODBase** Handle, const char* jpeg_string, unsigned long jpeg_size, int tiledWidth, int titledHeight, double overlap, const char* cameraId);
extern "C" ANSODENGINE_API void			RunTiledInferenceFromCV(ANSCENTER::ANSODBase** Handle, cv::Mat image, int tiledWidth, int titledHeight, double overlap, std::vector<ANSCENTER::Object>& results, const char* cameraId);

extern "C" ANSODENGINE_API std::string  RunInferenceInCroppedBBoxImages(ANSCENTER::ANSODBase * *Handle, unsigned char* jpeg_string,  unsigned int bufferLength, const char* cameraId, const char* strBboxes);
extern "C" ANSODENGINE_API std::string  RunInferenceInCroppedPolygonImages(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId, const char* strPolygon);
extern "C" ANSODENGINE_API std::string  RunInferenceBinary(ANSCENTER::ANSODBase * *Handle, unsigned char* jpeg_bytes, unsigned int width, unsigned int height);
extern "C" ANSODENGINE_API std::string  RunInferenceImagePath(ANSCENTER::ANSODBase * *Handle,const char* imageFilePath);
extern "C" ANSODENGINE_API std::string  OptimizeModelStr(const char* modelFilePath, const char* modelFileZipPassword, int modelType, int modelDetectionType, int fp16);

extern "C" ANSODENGINE_API std::string  RunInferenceFromCV(ANSCENTER::ANSODBase** Handle, cv::Mat image);
extern "C" ANSODENGINE_API void			RunDetectMovement(ANSCENTER::ANSODBase** Handle, cv::Mat image, const char* cameraId, std::vector<ANSCENTER::Object>& results);
extern "C" ANSODENGINE_API int          ReleaseANSODHandle(ANSCENTER::ANSODBase **Handle);

//// For LabVIEW API
extern "C" ANSODENGINE_API int          CreateANSODHandle_LV(ANSCENTER::ANSODBase * *Handle, const char* licenseKey, const char* modelFilePath, const char* modelFileZipPassword, float modelThreshold, float modelConfThreshold, float modelNMSThreshold, int autoDetectEngine,int modelType, int detectionType, int loadEngineOnCreation,LStrHandle labelMap);
extern "C" ANSODENGINE_API int          RunInference_LV(ANSCENTER::ANSODBase **Handle, unsigned char* jpeg_string, unsigned int bufferLength,LStrHandle detectionResult);
extern "C" ANSODENGINE_API int          RunTiledInference_LV(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, int tiledWidth, int titledHeight, double overlap, const char* cameraId, LStrHandle detectionResult);

extern "C" ANSODENGINE_API int			RunTiledInferenceFromJpegString_LV(ANSCENTER::ANSODBase** Handle, const char* jpeg_string, unsigned long jpeg_size, int tiledWidth, int titledHeight, double overlap, const char* cameraId,LStrHandle detectionResult);
extern "C" ANSODENGINE_API int			RunInferenceFromJpegString_LV(ANSCENTER::ANSODBase** Handle, const char* jpeg_string, unsigned long jpeg_size, const char* cameraId,LStrHandle detectionResult);
extern "C" ANSODENGINE_API int			RunInferenceBinary_LV(ANSCENTER::ANSODBase * *Handle, unsigned char* jpeg_bytes, unsigned int width, unsigned int height, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int			RunInferenceImagePath_LV(ANSCENTER::ANSODBase * *Handle, const char* imageFilePath, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int          OptimizeModel(const char* modelFilePath, const char* modelFileZipPassword,int modelType,int modelDetectionType, int fp16, LStrHandle optimizedModelFolder);
extern "C" ANSODENGINE_API int		    RunInferenceInCroppedBBoxImages_LV(ANSCENTER::ANSODBase * *Handle, unsigned char* jpeg_string, int32 bufferLength, const char* cameraId,const char* strBboxes, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int		    RunInferenceInCroppedBBoxPolygonImages_LV(ANSCENTER::ANSODBase * *Handle, unsigned char* jpeg_string, int32 bufferLength, const char* cameraId,const char* strPolygon, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int			RunDetectMovement_LV(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int			RunInferenceFromJpegStringWithCameraId_LV(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int			RunInferenceComplete_LV(ANSCENTER::ANSODBase** Handle,cv::Mat** cvImage , const char* cameraId, int getJpegString, int jpegImageSize, const char* activeROIMode,  LStrHandle detectionResult, LStrHandle imageStr);

extern "C" ANSODENGINE_API int			RunInferenceComplete_CPP(ANSCENTER::ANSODBase** Handle, cv::Mat** cvImage, const char* cameraId, const char* activeROIMode,std::vector<ANSCENTER::Object>& detectionResult);
extern "C" ANSODENGINE_API int			RunInference_CPP(ANSCENTER::ANSODBase** Handle, cv::Mat** cvImage, const char* cameraId, std::vector<ANSCENTER::Object>& detectionResult);
extern "C" ANSODENGINE_API int			ShutdownPythonEngine();
extern "C" ANSODENGINE_API int			ShutdownPythonEngine_CPP();

// For C# API
extern "C" __declspec(dllexport) const char* CreateANSODHandle_CS(ANSCENTER::ANSODBase** Handle, const char* licenseKey, const char* modelFilePath, 
																  const char* modelFileZipPassword, float modelThreshold, float modelConfThreshold, 
																  float modelNMSThreshold, int autoDetectEngine, int modelType, int detectionType, int loadEngineOnCreation);
extern "C" __declspec(dllexport) const char* RunInferenceImagePath_CS(ANSCENTER::ANSODBase** Handle, const char* imageFilePath);
extern "C" __declspec(dllexport) const char* RunInference_CS(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength);
extern "C" __declspec(dllexport) const char* RunInferenceInCroppedBBoxImages_CS(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId,const char* strBboxes);
extern "C" __declspec(dllexport) const char* RunInferenceInCroppedPolygonImages_CS(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId, const char* strPolygon);
extern "C" __declspec(dllexport) const char* RunInferenceBinary_CS(ANSCENTER::ANSODBase** Handle, unsigned char* jpeg_bytes, unsigned int width, unsigned int height);
extern "C" __declspec(dllexport) const char* OptimizeModelStr_CS(const char* modelFilePath, const char* modelFileZipPassword, int modelType, int modelDetectionType, int fp16);

// Utilities
extern "C" __declspec(dllexport) int GetEngineType();
extern "C" __declspec(dllexport) int LoadModelFromFolder(ANSCENTER::ANSODBase** Handle, const char* licenseKey,
														const char* modelName,
														const char* className,
														float detectionScoreThreshold,
														float modelConfThreshold,
														float modelMNSThreshold,
														int autoDetectEngine,
														int modelType,
														int detectionType,
														int loadEngineOnCreation,
														const char* modelFolder,
														std::string&labelMap);
extern "C" __declspec(dllexport) int GetActiveRect(ANSCENTER::ANSODBase** Handle,cv::Mat cvImage, cv::Rect &activeWindow);
extern "C" __declspec(dllexport) int DetectMovement(ANSCENTER::ANSODBase** Handle, cv::Mat image, const char* cameraId, std::vector<ANSCENTER::Object>& results);
extern "C" __declspec(dllexport) int Optimize(ANSCENTER::ANSODBase** Handle,bool fp16);
extern "C" __declspec(dllexport) int SetODParameters(ANSCENTER::ANSODBase** Handle, const char* parameters);
extern "C" __declspec(dllexport) int GetODParameters(ANSCENTER::ANSODBase** Handle, ANSCENTER::Params &param);
extern "C" __declspec(dllexport) int GetConfiguredParameters(ANSCENTER::ANSODBase** Handle, LStrHandle stParam);
extern "C" __declspec(dllexport) int GetConfiguredParameters_CPP(ANSCENTER::ANSODBase** Handle, std::string& stParam);
extern "C" __declspec(dllexport) int UpdateDetectionMinScore(ANSCENTER::ANSODBase** Handle, float detectionScore);

//std::string licenseKey, ModelConfig modelConfig, std::string modelName, std::string className, const std::string& modelFolder, std::string& labelMap
extern "C" __declspec(dllexport) int SetPrompt(ANSCENTER::ANSODBase** Handle, const char* textPrompt);
extern "C" __declspec(dllexport) int SetTracker(ANSCENTER::ANSODBase** Handle,int trackerType, int enableTracker);
extern "C" __declspec(dllexport) int SetTrackerParameters(ANSCENTER::ANSODBase** Handle, const char* trackerParams);
extern "C" __declspec(dllexport) int SetStabilizationParameters(ANSCENTER::ANSODBase** Handle, const char* stabParams);


// Version 2
extern "C" ANSODENGINE_API int RunInferenceComplete_LV_V2(
	uint64_t handleVal,
	cv::Mat** cvImage,
	const char* cameraId,
	int getJpegString,
	int jpegImageSize,
	const char* activeROIMode,
	LStrHandle detectionResult,
	LStrHandle imageStr);
extern "C" ANSODENGINE_API int RunTiledInference_LV_V2(uint64_t handleVal, unsigned char* jpeg_string, unsigned int bufferLength, int tiledWidth, int titledHeight, double overlap, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunTiledInferenceFromJpegString_LV_V2(uint64_t handleVal, const char* jpeg_string, unsigned long jpeg_size, int tiledWidth, int titledHeight, double overlap, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunInferenceFromJpegString_LV_V2(uint64_t handleVal, const char* jpeg_string, unsigned long jpeg_size, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunInferenceBinary_LV_V2(uint64_t handleVal, unsigned char* jpeg_bytes, unsigned int width, unsigned int height, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunInferenceImagePath_LV_V2(uint64_t handleVal, const char* imageFilePath, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunInferenceInCroppedBBoxImages_LV_V2(uint64_t handleVal, unsigned char* jpeg_string, int32 bufferLength, const char* cameraId, const char* strBboxes, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunInferenceFromJpegStringWithCameraId_LV_V2(uint64_t handleVal, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunDetectMovement_LV_V2(uint64_t handleVal, unsigned char* jpeg_string, unsigned int bufferLength, const char* cameraId, LStrHandle detectionResult);
extern "C" ANSODENGINE_API int RunInferenceInCroppedBBoxPolygonImages_LV_V2(uint64_t handleVal, unsigned char* jpeg_string, int32 bufferLength, const char* cameraId, const char* strPolygon, LStrHandle detectionResult);
#endif