#pragma once
#include "CManageDB.h"
#include "CSingleTemplate.h"

#ifdef C_PR_STRATEGY_ALN_EXPORTS
#define C_PR_STRATEGY_ALN_DLL_API __declspec(dllexport)
#else
#define C_PR_STRATEGY_ALN_DLL_API //__declspec(dllimport)
#endif

using namespace ns_db;
using namespace JVision;

namespace ns_pr
{
	//�˴������ƫ��Ϊ�����RefPos���������꣨΢�ף�
	struct FIND_MULTI_TEMP_STRUCT
	{
		//PR_OUTPUT_TYPE type;			//��������

		//XY_DOUBLE_STRUCT AbsPos;		//�����
		XY_DOUBLE_STRUCT RefPos;		//�ο�λ�ã�����ƫ����Դ�Ϊ��׼
		double score;						//����
		double x;						//x����ƫ�΢�ף�
		double y;						//y����ƫ�΢�ף�
		union
		{
			double angle;		//�Ƕ�ƫ��ȣ�
			double radius;		//�뾶
		};
	};

	class C_PR_STRATEGY_ALN_DLL_API CMultiTemplate
	{
    private:
        CAxis* m_pAxisX = nullptr;  // X��ָ��
        CAxis* m_pAxisY = nullptr;  // Y��ָ��
        CAxis* m_pAxisZ = nullptr;  // Z��ָ��
        CAxis* m_pAxisR = nullptr;  // R��ָ��
        bool m_bIsInitSuccess = false;  // ��ʼ���Ƿ�ɹ��ı�־
        CProduct* m_pCProduct = nullptr;  // ��Ʒָ��
        CSingleTemplate* m_pCPrTemplate = nullptr;  // ��ģ��ָ��
        vector<CAMERA_CALIB_STRUCT> m_VecCamera;  // ���У׼�ṹ������

        // �������Ƿ���ȷ
        // ������nCameraId - ���ID
        // ����ֵ��������ID��������������У�����true�����򷵻�false
        bool CheckCameraId(UINT nCameraId);

        // �����������ƶ���ָ��λ�ã�������ͬ������
        // ������dX - X��Ŀ��λ�ã�dY - Y��Ŀ��λ�ã�dZ - Z��Ŀ��λ�ã�dR - R��Ŀ��λ��
        // ����ֵ�������ɹ�����OK�����򷵻ش�����
        LONG ModuleMove(double dX, double dY, double dZ, double dR);

        // ͨ�����Id��ȡ���ָ��
        // ������nCameraID - ���ID
        // ����ֵ������ҵ���Ӧ������������ָ�룻���򷵻�nullptr
        CCameraBase* GetCameraPoint(UINT nCameraID);

        // ͨ�����Id��ȡ���XY�궨ָ��
        // ������nCameraID - ���ID
        // ����ֵ������ҵ���Ӧ�����XY�궨������XY�궨ָ�룻���򷵻�nullptr
        CXYCalib* GetXYCalibPoint(UINT nCameraID);

        // ͨ������Id����ȡ������ͼģ��
        // ������iStrategyId - ����ID��stTemplate - ���ڴ洢��ȡ����ģ�������
        // ����ֵ�������ɹ�����OK�����򷵻ش�����
        LONG GetAlnTemplateById(UINT iStrategyId, vector<PR_TEMPLATE>& stTemplate);

        // ͨ������Id����ȡ�ο�λ��
        // ������iStrategyId - ����ID��stRef - ���ڴ洢�ο�λ�õĽṹ��
        // ����ֵ�������ɹ�����OK�����򷵻ش�����
        LONG GetAlnRefById(UINT iStrategyId, X_Y_ANGLE_STRUCT& stRef);

        
    
    public:
        // ���������������ͷ���Դ
        ~CMultiTemplate();
        // ���캯������ʼ��CMultiTemplate����
        // ������vecCamer - ���У׼�ṹ��������pX - X��ָ�룻pY - Y��ָ�룻pZ - Z��ָ�루��ѡ��Ĭ��Ϊnullptr����pR - R��ָ�루��ѡ��Ĭ��Ϊnullptr��
        CMultiTemplate(vector<CAMERA_CALIB_STRUCT> vecCamer, CAxis* pX, CAxis* pY, CAxis* pZ = nullptr, CAxis* pR = nullptr);

        // �ж϶����Ƿ��ʼ���ɹ�
        // ����ֵ�������ʼ���ɹ�������true�����򷵻�false
        bool IsInitSuccess() { return m_bIsInitSuccess; };

        // ������ģ�壬����һ��Pr���Եõ��ľ��ԣ�X��Y��΢�ף��Լ��Ƕȣ��ȣ�
        // ������stVecTemplate - �������
        // ������nDelayTakePicture - ������ʱ��
        // ������stOutAln - �������������ṹ��
        // ����ֵ�������ɹ�����OK�����򷵻ش�����
        LONG SearchMultipleTemplate(vector<PR_TEMPLATE> stVecTemplate, UINT nDelayTakePicture, X_Y_ANGLE_STRUCT& stOutAln);

        /// <summary>
        /// ����PR����Id������ģ��ƥ�䣬��������Ľ��
        /// </summary>
        /// <param name="iStrategyId">����id</param>
        /// <param name="nDelayTakePicture">������ʱ</param>
        /// <param name="stOutAln">���ֵ �Ե���</param>
        /// <returns>�ɹ�����OK�����򷵻ش�����</returns>
        LONG SearchAlnModels(UINT iStrategyId, UINT nDelayTakePicture, FIND_MULTI_TEMP_STRUCT& stOutAln);

        // ���������
        // ������vecTemplateId - �ID����
        // ����ֵ�������ɹ�����OK�����򷵻ش�����
        LONG CreateAlnModels(vector<UINT> vecTemplateId);
    };
}