#pragma once
#include "CManageDB.h"
#include "CAxis.h"
#include "CCameraBase.h"
//#include "CXYCalib.h"
//#include "ILocalizationManager.h"
#include "CPxielLocation.h"

#ifdef C_PR_TEMPLATE_EXPORTS
#define C_PR_TEMPLATE_DLL_API __declspec(dllexport)
#else
#define C_PR_TEMPLATE_DLL_API //__declspec(dllimport)
#endif

using namespace ns_db;
using namespace JVision;
class CXYCalib;

namespace ns_pr
{
    //�˴������ƫ��Ϊ��������ʮ�ֹ�����ĵ��������꣨΢�ף�
    struct FIND_SINGLE_TEMP_STRUCT
    {
        PR_OUTPUT_TYPE type;			//��������

        double score;						//����
        double x;						//x����ƫ�΢�ף�
        double y;						//y����ƫ�΢�ף�
        union
        {
            double angle;		//�Ƕ�ƫ��ȣ�
            double radius;		//�뾶
        };
    };

    // ���У׼�ṹ�壬���ڴ洢���ָ��Ͷ�Ӧ������У׼ָ��
    struct CAMERA_CALIB_STRUCT
    {
        CCameraBase* pCamera; // ָ����������ָ��
        CXYCalib* pXYCalib;   // ָ������У׼�����ָ��
    };

    // CSingleTemplate �࣬���ڴ�����ģ����صIJ���
    class C_PR_TEMPLATE_DLL_API CSingleTemplate
    {
    private:
        bool m_bIsInitSuccess; // ��dz�ʼ���Ƿ�ɹ�
        CProduct* m_pCProduct = nullptr; // ָ���Ʒ��ض����ָ�룬�������������ݿ⽻����ȡ��Ʒ��Ϣ
        //ILocalizationManager* m_pLocalizationManager = nullptr; // ���ػ���������ָ�룬��ʱע�͵��������ں���������չ��ʹ��
        CPixelLocation* m_pPixelLocation = nullptr; // ����λ�ô�������ָ�룬���ڴ���ͼ��������λ����ز���
        vector<CAMERA_CALIB_STRUCT> m_VecCamera; // �洢���У׼�ṹ�������
        // ��ֹĬ�Ϲ��캯����ȷ������ֻ��ͨ���ض���ʽ��ʼ��
        //CSingleTemplate() = delete; 
        // ������ID�Ƿ��ڴ洢������б���
        // ���� nCameraId��Ҫ�������ID
        bool CheckCameraId(UINT nCameraId);
        // ͨ�����ID��ȡ�������ָ��
        // ���� nCameraID��Ŀ�������ID
        // ����ֵ��ָ����������ָ�룬���δ�ҵ��򷵻� nullptr
        CCameraBase* GetCameraPoint(UINT nCameraID);
        // ͨ�����ID��ȡ�����XY�궨����ָ��
        // ���� nCameraID��Ŀ�������ID
        // ����ֵ��ָ�����XY�궨�����ָ�룬���δ�ҵ��򷵻� nullptr
        CXYCalib* GetXYCalibPoint(UINT nCameraID);
        // ͨ��ģ��ID��ȡģ����Ϣ
        // ���� iTemplateId��Ҫ��ȡ��ģ��ID
        // ���� stTemplate�����ڴ洢��ȡ����ģ����Ϣ�Ľṹ������
        // ����ֵ���������������ɹ����� OK��ʧ�ܷ��� FAIL ��
        LONG GetTemplateById(UINT iTemplateId, PR_TEMPLATE& stTemplate);
        // ����ͼƬ��outPointΪ�����ͼƬ���Ͻǵĵ㣬��ʱע�͵��������ں�������������ʹ��
        // ���� iPrMethod������ʹ�õķ���ID
        // ���� image��Ҫ������ͼ����Ϣ
        // ���� outPoint�����ڴ洢��������������ͼƬ���Ͻǵĵ�Ľṹ������
        // ����ֵ���������������ɹ����� OK��ʧ�ܷ��� FAIL ��
        //LONG SearchImageByLocalization(UINT iPrMethod, ImageInfo image,FIND_OUTPUT_STRUCT& outPoint); 
    public:
        // ���캯����ʹ�ô�������У׼�ṹ���������г�ʼ��
        // ���� vecCamer���������������У׼��Ϣ�Ľṹ������
        CSingleTemplate(vector<CAMERA_CALIB_STRUCT> vecCamer);

        // ��ȡ��ʼ���Ƿ�ɹ���״̬
        // ����ֵ����ʼ���ɹ����� true��ʧ�ܷ��� false
        bool IsInitSuccess() { return m_bIsInitSuccess; };

        // ���ݸ�����ģ����Ϣ�������ӳ�ʱ�䣬������ģ�壬���������ʮ�ֹ�����ĵ�X��Y��΢��ֵ���Լ��Ƕȣ��ȣ�ƫ��
        // ���� stTemplate������ģ�������Ϣ�Ľṹ�壬�����ID��������
        // ���� nDelayTakePicture������ǰ���ӳ�ʱ�䣨��λΪ���룩
        // ���� stOutOffset�����ڴ洢�������ƫ����Ϣ�Ľṹ�����ã�����X��Y�ͽǶ�ƫ��
        // ����ֵ���������������ɹ����� OK��ʧ�ܷ��� FAIL ��
        LONG SearchTemplate(PR_TEMPLATE stTemplate, UINT nDelayTakePicture, FIND_SINGLE_TEMP_STRUCT& stOutOffset);

        // ���ݸ�����ģ��ID�������ӳ�ʱ�䣬������ģ�壬���������ʮ�ֹ�����ĵ�X��Y��΢��ֵ���Լ��Ƕȣ��ȣ�ƫ��
        // ���� iTemplateId��Ҫ������ģ��ID
        // ���� nDelayTakePicture������ǰ���ӳ�ʱ�䣨��λ���룩
        // ���� stOutOffset�����ڴ洢�������ƫ����Ϣ�Ľṹ�����ã�����X��Y�ͽǶ�ƫ��
        // ����ֵ���������������ɹ����� OK��ʧ�ܷ��� FAIL ��
        LONG SearchTemplate(UINT iTemplateId, UINT nDelayTakePicture, FIND_SINGLE_TEMP_STRUCT& stOutOffset);

        // ����ģ�壬����ģ�����͡����ID��ʶ�𷽷���ץȡλ�õȲ�������ѡ���ѡ�����
        // ���� iModuleType��������������
        // ���� iCameraId��ʹ�õ����ID
        // ���� iPrMethod��ģ��ʶ�𷽷�ID
        // ���� stGrabPos������ץȡλ����Ϣ�Ľṹ�壬���ܰ���X��Y��Z�������ת�Ƕȵ�
        // ���� eResultSelect�����ѡ��ö��ֵ��Ĭ��ֵΪ SEARCH_OUT::OUT_All������ָ���������������
        // ����ֵ���������������ɹ����� OK��ʧ�ܷ��� FAIL ��
        LONG CreateTemplate(UINT iCameraId, UINT iPrMethod, X_Y_Z_R_STRUCT stGrabPos, SEARCH_OUT eResultSelect,UINT &iTemplateId);
    };

}