// *****************************************************************************
// ��Ȩ���У�C��2023~2099 �Ϻ����ɳ������������޹�˾
// ��������Ȩ��
// *****************************************************************************
// ���� : ���
// �汾 : 1.0
// ����˵��:
//           ��ǰ��Ϊ��ִ��ͨ�ú���
// *****************************************************************************
#ifndef __JORIGINALMAINWND_H__
#define __JORIGINALMAINWND_H__ 1

#include <QMainWindow>
#include <TypeDef.h>
#include <QScrollArea>
#include "CameraMaterialGroupWnd/CameraImage/CameraImageHandler.h"
#include "Src/CameraBind.h"
// ���庯��ָ������
// ����ָ������
using FunSignaPo = std::function<void(int, JVision::ImageInfo)>;
using FunSignaPoA = void (*)(int, JVision::ImageInfo);
using FunSlotPo  = std::function<void()>;
using FunSlotPoA  = void (*)();


// ģ�庯������
struct STR_TEMPLATE
{
    QScrollArea*              pView;
    std::vector<FunSlotPo>    veSlotFun;    // �ܺ���
    std::vector<FunSignaPo>   veSignalFun;  // �ź�
};

// ��ǰѡ���Group
struct ST_CURRENT_SELECT_GROUP
{
    /**��ǰѡ�е�
     */
    Group*              pSelectGroup;

    /**��ǰ���ID 
     */
    int                 nCurrentCameraId;


    int                 nGroupId;

    /**��ǰѡ����ߣ��ұߴ󴰿�
    */
    int                nSelectLeft1;

    bool               isBond;

    /**�󶨴���
     */
    int               nBindNumber;
    bool              isInitialed;
};

class JOriginalMainWnd: public QMainWindow
{
    Q_OBJECT
public:
    explicit JOriginalMainWnd(QWidget* parent = nullptr);

    ~JOriginalMainWnd();

public: //--- �����κ��߼�����Ҫ�����ȵ������ھ���
    /**�������, û��Ҫһֱnew ��ֻ�ǿ���
     */
    virtual void InitMainCameraBind(CameraBind* pCameraBind) = 0;

    /**�����л��������ٱ�����
     */
    virtual void UnCameraBind() = 0;

    /**���������
    */
    virtual void CameraConnectUpdateImageFun(int nIndex, Group* widget, bool isUnCameraBind = false) = 0;

    virtual void UpdateCameraDisplay0(int iCameraId, JVision::ImageInfo imageData) = 0;
    virtual void UpdateCameraDisplay1(int iCameraId, JVision::ImageInfo imageData) = 0;
    virtual void UpdateCameraDisplay2(int iCameraId, JVision::ImageInfo imageData) = 0;
    virtual void UpdateCameraDisplay3(int iCameraId, JVision::ImageInfo imageData) = 0;
    virtual void UpdateCameraDisplay4(int iCameraId, JVision::ImageInfo imageData) = 0;


    /**�����ͷ�
     */
   // virtual void DelBind() = 0;

public: // ͨ��ģ�庯��
    template<class Y>
    void CameraConnectUpdateImageFunA(Y calssFun,int nIndex, Group* widget, bool isUnCameraBind = false);


    template<class Y>
    void InitAllCamerPage(STR_TEMPLATE strFun,Y Fun);

    // ����ͨ��ģ��
  /*  template <typename Y, typename T>
    using CameraImageHandlera = void (Y::*)(const T&);*/

    template <typename Y, typename T>
    void SwitchToConfigAAAAA(void (Y::* switchMethod)(const T&));

public:
    std::vector<std::unique_ptr<CameraImageHandler>> m_manager;

    /**���ڹ������еĿ��ƣ�
     */
    CameraBind* m_pMainCameraBind = nullptr;
};

template<class Y>
void JOriginalMainWnd::CameraConnectUpdateImageFunA(Y calssFun, int nIndex, Group* widget, bool isUnCameraBind /*= false*/)
{
    auto BinCamerasImage = [&](void (calssFun::* pCamerasImage)(const QPixmap& imageData))
    {
        if (isUnCameraBind)
        {
            //disconnect(widget, &Group::SetCurrentSelectSig, this, &ChartsAndCamerasWnd::GetCurrentSelectSlots);
            disconnect(this, pCamerasImage, widget, &Group::UpDataImageShowSlots);
        }
        else
        {
            //���ú���
            connect(widget, &Group::sendUpdateGroupState, this, &SingleCameraOperationWnd::checkSettings);
            connect(this, pCamerasImage, widget, &Group::UpDataImageShowSlots);
        }

    };

    if (nIndex == 0)
    {
        BinCamerasImage(&calssFun::UpDataImageShowSignals0);
    }
    else if (nIndex == 1)
    {
        BinCamerasImage(&calssFun::UpDataImageShowSignals1);
    }
    else if (nIndex == 2)
    {
        BinCamerasImage(&calssFun::UpDataImageShowSignals2);
    }
    else if (nIndex == 3)
    {
        BinCamerasImage(&calssFun::UpDataImageShowSignals3);
    }
    else if (nIndex == 4)
    {
        BinCamerasImage(&calssFun::UpDataImageShowSignals4);
    }
}

template <typename Y, typename T>
void JOriginalMainWnd::SwitchToConfigAAAAA(void (Y::* switchMethod)(const T&))
{
    int A = 10;
}

#endif  //__JORIGINALMAINWND_H__