#pragma once
#include "CManageDB.h"
#include "CMultiTemplate.h"
#include "CCameraBase.h"
#include "ILocalizationManager.h"
#include "IPicOperate.h"

#ifdef C_PR_STRATEGY_EXPORTS
#define C_PR_STRATEGY_DLL_API __declspec(dllexport)
#else
#define C_PR_STRATEGY_DLL_API //__declspec(dllimport)
#endif

using namespace ns_db;
using namespace JVision;

namespace ns_pr
{
    /**
     * @brief CPRStrategy �࣬���ڴ���ģ��ƥ�������ز�����֧�ֵ�ģ��Ͷ�ģ��ƥ�䡣
     */
    class C_PR_STRATEGY_DLL_API CPRStrategy
    {
    private:
        bool m_bIsInitSuccess = false; // ��ʼ���Ƿ�ɹ��ı�־
        CMultiTemplate* m_pMultiTemp = nullptr; // ��ģ���������ָ��
        CSingleTemplate* m_pSingleTemp = nullptr; // ��ģ���������ָ��
        CAxis* m_pAxisX = nullptr; // X �����ָ��
        CAxis* m_pAxisY = nullptr; // Y �����ָ��
        CAxis* m_pAxisZ = nullptr; // Z �����ָ��
        CAxis* m_pAxisR = nullptr; // R �����ָ��
        vector<CAMERA_CALIB_STRUCT> m_VecCamera; // ���У׼�ṹ������
    public:
        CPRStrategy();
        /**
         * @brief ���캯����ʹ�����У׼�ṹ��������������ָ���ʼ������
         *
         * @param vecCamera ���У׼�ṹ��������������������У׼��Ϣ��
         * @param pX X �����ָ�룬���ڿ��� X ����ƶ���λ�û�ȡ��
         * @param pY Y �����ָ�룬���ڿ��� Y ����ƶ���λ�û�ȡ��
         * @param pZ Z �����ָ�룬��ѡ������Ĭ��Ϊ nullptr�����ڿ��� Z ����ƶ���λ�û�ȡ��
         * @param pR R �����ָ�룬��ѡ������Ĭ��Ϊ nullptr�����ڿ��� R �����ת�ͽǶȻ�ȡ��
         */
        CPRStrategy(vector<CAMERA_CALIB_STRUCT> vecCamera, CAxis* pX, CAxis* pY, CAxis* pZ = nullptr, CAxis* pR = nullptr);
        /**
         * @brief ���캯����ʹ�õ����������У׼��Ϣ�Լ�������ָ���ʼ������
         *
         * @param pCamera �������ָ�룬����ͼ��ɼ���
         * @param pXYCalib ��� XY У׼����ָ�룬���������У׼������
         * @param pX X �����ָ�룬���ڿ��� X ����ƶ���λ�û�ȡ��
         * @param pY Y �����ָ�룬���ڿ��� Y ����ƶ���λ�û�ȡ��
         * @param pZ Z �����ָ�룬��ѡ������Ĭ��Ϊ nullptr�����ڿ��� Z ����ƶ���λ�û�ȡ��
         * @param pR R �����ָ�룬��ѡ������Ĭ��Ϊ nullptr�����ڿ��� R �����ת�ͽǶȻ�ȡ��
         */
        CPRStrategy(CCameraBase* pCamera, CXYCalib* pXYCalib, CAxis* pX, CAxis* pY, CAxis* pZ = nullptr, CAxis* pR = nullptr);
        /**
         * @brief �����������ͷŶ�̬�������Դ��
         */
        ~CPRStrategy();
        /**
         * @brief ���� PR ���� ID ����ģ��ƥ�䣬��������Ľ����
         *
         * @param iId ʶͼ ID��ģ�� ID ����� ID��������ָ��Ҫƥ���ģ�����ԡ�
         * @param nDelayTakePicture ������ʱ����λ���ܸ��ݾ���ϵͳ���������ڿ������յ�ʱ����
         * @param stOffset ���ֵ�������뵱ǰλ�õ�ƫ��ֵ����λΪ um��΢�ף������ڱ�ʾƥ������λ�úͽǶ�ƫ�
         * @return LONG ����������ɹ����� OK�����򷵻���Ӧ�Ĵ����롣
         */
        LONG SearchModels(UINT iId, UINT nDelayTakePicture, FIND_MULTI_TEMP_STRUCT& stOffset);
        /**
         * @brief ���ص� SearchModels ������ʹ�ò�ͬ������ṹ�塣
         *
         * @param iId ʶͼ ID��ģ�� ID ����� ID��������ָ��Ҫƥ���ģ�����ԡ�
         * @param nDelayTakePicture ������ʱ����λ���ܸ��ݾ���ϵͳ���������ڿ������յ�ʱ����
         * @param stOffset ���ֵ�������뵱ǰλ�õ�ƫ��ֵ���� X_Y_ANGLE_STRUCT �ṹ���ʾ����λΪ um��΢�ף��ͽǶȡ�
         * @return LONG ����������ɹ����� OK�����򷵻���Ӧ�Ĵ����롣
         */
        LONG SearchModels(UINT iId, UINT nDelayTakePicture, X_Y_ANGLE_STRUCT& stOffset);
        /**
         * @brief ����ģ�塣
         *
         * @param iCameraId ��� ID������ָ��ʹ���ĸ��������ģ�崴����
         * @param iPrMethod PR ���� ID������ָ������ģ����ʹ�õķ�����
         * @return LONG ����������ɹ����� OK�����򷵻���Ӧ�Ĵ����롣
         */
        LONG CreateTemplate(UINT iCameraId, UINT iPrMethod, SEARCH_OUT eResultSelect, UINT& iTemplateId);
        /**
         * @brief ����ģ�塣
         *
         * @param iPrMethod ������Id��
         * @param iCameraId ��� ID������ָ��ʹ���ĸ��������ģ�崴����
         * @return LONG ����������ɹ����� OK�����򷵻���Ӧ�Ĵ����롣
         */
        LONG CreatePrMethod(UINT iCameraId,UINT& iPrMethod);
        /**
         * @brief ���� PR ���ԡ�
         *
         * @param vecTemplateId ģ�� ID �������������ģ��� ID������ָ��������������ģ�塣
         * @return LONG ����������ɹ����� OK�����򷵻���Ӧ�Ĵ����롣
         */
        LONG CreatePrStrategy(vector<UINT> vecTemplateId);

        static LONG EditTemplate(UINT iTemplateId);
    };

}