#pragma once
//#include "McGlobal.h"
#include "CAxis.h"
#include "CCameraBase.h"
#include "CManageDB.h"
#include "CMachineCalibration.h"
#include "CPrStrategy.h"
#include "CMathCalc.h"
#include "ICalibration.h"
#include "CPxielLocation.h"
#include "CHardwareList.h"

/*
 * �궨��
 * ��������:
 * 1��ִ�б궨����
 * 2������궨���
 * 3������ת���ӿڣ���Ȼ������δֱ����������ת���ӿڵľ���ʵ�֣����������ͼ�����˹��ܣ�
 */
using namespace ns_db;
using namespace ns_pr;

class __declspec(dllexport) CCalib
{
public:
    /**
     * @brief ���캯��
     * @param GetModuleType ģ�����ͣ����ڱ�ʶ��ͬ��ģ�飬���庬��ȡ����ҵ���߼�
     * @param GetModuleName ģ�����ƣ��������ֲ�ͬ��ģ��
     */
    CCalib(int GetModuleType, string GetModuleName);

    /**
     * @brief ��������
     * ������������Ϊ�գ�û���������Դ�ͷŲ����������������˶�̬�������Դ����Ҫ�ڴ˴������ͷ�
     */
    ~CCalib() {}

    /**
     * @brief ���� X �� Y ��
     * @param xAxis X �����ָ��
     * @param yAxis Y �����ָ��
     */
    void SetXYAxis(CAxis* xAxis, CAxis* yAxis) {
        m_pXAxis = xAxis;
        m_pYAxis = yAxis;
    };

    /**
     * @brief ���� X��Y �� Z ��
     * @param xAxis X �����ָ��
     * @param yAxis Y �����ָ��
     * @param zAxis Z �����ָ��
     */
    void SetXYZAxis(CAxis* xAxis, CAxis* yAxis, CAxis* zAxis) {
        m_pXAxis = xAxis;
        m_pYAxis = yAxis;
        m_pZAxis = zAxis;
    };

    /**
     * @brief ���� X��Y �� R ��
     * @param xAxis X �����ָ��
     * @param yAxis Y �����ָ��
     * @param rAxis R �����ָ��
     */
    void SetXYRAxis(CAxis* xAxis, CAxis* yAxis, CAxis* rAxis) {
        m_pXAxis = xAxis;
        m_pYAxis = yAxis;
        m_pRAxis = rAxis;
    };

    /**
     * @brief ���� X��Y��Z �� R ��
     * @param xAxis X �����ָ��
     * @param yAxis Y �����ָ��
     * @param zAxis Z �����ָ��
     * @param rAxis R �����ָ��
     */
    void SetXYZRAxis(CAxis* xAxis, CAxis* yAxis, CAxis* zAxis, CAxis* rAxis) {
        m_pXAxis = xAxis;
        m_pYAxis = yAxis;
        m_pZAxis = zAxis;
        m_pRAxis = rAxis;
    }

    /**
     * @brief �����������
     * @param camera �������ָ��
     * �ú�����Ԥ���˴��� PR ���Զ���Ĵ���λ�ã������ɸ����������Ӿ���ʵ��
     */
    void SetCamera(CCameraBase* camera) {
        m_pCamera = camera;
        //m_pPRStrategy = new
    }

    /**
     * @brief ��ʼ�궨����
     * @return �궨�����ķ���ֵ�����庬��ȡ����ҵ���߼���ͨ�� 0 ��ʾ�ɹ����� 0 ��ʾʧ��
     * �ú���Ϊ���麯������Ҫ����������ʵ�־���ı궨�߼�
     */
    virtual int StartCalib() { return OK; };

    /**
     * @brief ��ȡ�궨����
     * �ú���Ϊ���麯������Ҫ����������ʵ�־���Ļ�ȡ�����߼�
     */
    virtual LONG GetParam() = 0;

    /**
     * @brief ���ñ궨����
     * �ú���Ϊ���麯������Ҫ����������ʵ�־�������ò����߼�
     */
    virtual void SetParam() = 0;

    virtual void Stop() { m_bStop = true; }

protected:
    LONG SearchTemp(int iTempID, CCameraBase* camera, bool isToCameraCenter, XY_DOUBLE_STRUCT& outResult);

protected:
    int m_nID = 0;              // ģ��� ID������Ψһ��ʶ��ͬ��ģ��
    string m_sName = "";        // ģ������ƣ��������ֲ�ͬ��ģ��
    CAxis* m_pXAxis = nullptr;  // X �����ָ��
    CAxis* m_pYAxis = nullptr;  // Y �����ָ��
    CAxis* m_pZAxis = nullptr;  // Z �����ָ��
    CAxis* m_pRAxis = nullptr;  // R �����ָ��
    CCameraBase* m_pCamera = nullptr;  // �������ָ��
    ICalibration* m_pCalibration = nullptr;  // �궨�ӿڶ���ָ��
    CPixelLocation* m_pPixelLocation = nullptr;  // ����λ�ö���ָ��
    CManageDB* m_pManageDB = nullptr;
    CMachineCalibration* m_pCalibDB = nullptr; 

    bool m_bStop = false;

    int imageNum = 0;

    // ע���еĺ����������������ڶ�λ������δ������ʵ��
    //LONG Location(int temp, ImageInfo image, X_Y_ANGLE_STRUCT outResult);
};