#ifndef __NODES_AND_CONNECTORS__
#define __NODES_AND_CONNECTORS__

#include <vector>
#include <memory>
#include "imgui.h"
#include "imnodes.h"
#include "ID_Generator.hpp"

// =====================================接口抽象======================================================

class Abs_Connector // 抽象接口类
{
public:
    typedef enum
    {
        CONNECTOR_TYPE_UNKNOWN, // 未知连接点类型
        CONNECTOR_TYPE_OUTPUT,  // 输出
        CONNECTOR_TYPE_INPUT,   // 输入
    } Connector_Type_Enum;      // 接口类型枚举

protected:
    // ID 分配器
    Independent_ID_Generator *ID_Generator;

    int id;                   // ID
    Connector_Type_Enum type; // 类型标识
    const char *socket_str;   // 套接字字符串

    std::vector<Abs_Connector *> related_connector_list; // 关联列表
    void *product;                                       // 产物（仅输出类节点持有）

public:
    // 显式禁用默认构造
    Abs_Connector() = delete;

    // 必要构造
    Abs_Connector(Independent_ID_Generator *ID_Generator, Connector_Type_Enum type, const char *socket_str);

    // 析构
    ~Abs_Connector();

    // 连接到目标连接点
    virtual bool Connect_To(Abs_Connector *target);

    // 断开所有连接
    virtual void Disconnect_All(void);

    // 与指定的接口断开连接
    virtual bool Disconnect_To(Abs_Connector *target);

    // 注册产物
    virtual bool Register_Product(void *product, size_t size);

    // 获取关联接口列表
    virtual std::vector<Abs_Connector *> Get_Related_List(void);

    // 获取产物
    virtual void *Get_Product(void);

    // 获取ID
    virtual int Get_ID(void);

    // 获取接口类型
    virtual Connector_Type_Enum Get_Type(void);

    // 绘制连接点
    virtual void Show(void) = 0;
};

// =====================================节点抽象======================================================

class Abs_Node // 抽象节点类
{
public:
    typedef enum
    {
        NODE_TYPE_UNKNOWN,        // 未知节点类型
        NODE_TYPE_CONNECTOR_TEST, // 接口测试节点
        NODE_TYPE_MSG_LINE_INPUT, // 消息输入节点
        NODE_TYPE_CSV_EXPORTER,   // CSV输出节点
    } Node_Type_Enum;             // 节点类型枚举

protected:
    // ID 分配器
    Independent_ID_Generator *Node_ID_Generator;      // 节点ID生成器
    Independent_ID_Generator *Connector_ID_Generator; // 连接点ID生成器

    int id;                  // ID
    Node_Type_Enum type;     // 类型
    ImVec2 initial_position; // 初始位置

    bool close_flag; // 关闭标志位

    // 接口列表
    std::vector<std::shared_ptr<Abs_Connector>> Connector_List;

public:
    // 显式禁用默认构造
    Abs_Node() = delete;

    // 必要构造
    Abs_Node(Independent_ID_Generator *Node_ID_Generator,
             Independent_ID_Generator *Connector_ID_Generator,
             Node_Type_Enum type,
             ImVec2 initial_position = ImVec2(0, 0));

    // 析构
    ~Abs_Node();

    // 绘制节点
    virtual void Show(void) = 0;

    // 执行处理流程
    virtual bool Execute_Process(void) = 0;

    // 获取ID
    virtual int Get_ID(void);

    // 获取节点类型
    virtual Node_Type_Enum Get_Type(void);

    // 获取关闭信号
    virtual bool Get_CloseFlag(void);

    // 获取接口列表
    std::vector<std::shared_ptr<Abs_Connector>> &Get_Connector_List(void);
};

// ====================================接口类声明================================================

// DLT信息输出接口
class MSG_OutPut_Connector : public Abs_Connector
{
public:
    // 显式禁用默认构造
    MSG_OutPut_Connector() = delete;

    // 必要构造
    explicit MSG_OutPut_Connector(Independent_ID_Generator *ID_Generator);

    // 绘制接口
    virtual void Show(void);
};

// DLT信息输入接口
class MSG_InPut_Connector : public Abs_Connector
{
public:
    // 显式禁用默认构造
    MSG_InPut_Connector() = delete;

    // 必要构造
    explicit MSG_InPut_Connector(Independent_ID_Generator *ID_Generator);

    // 绘制接口
    virtual void Show(void);
};

// CSV 列输入接口
class CSV_Column_Input_Connector : public Abs_Connector
{
public:
    // 显式禁用默认构造
    CSV_Column_Input_Connector() = delete;

    // 必要构造
    explicit CSV_Column_Input_Connector(Independent_ID_Generator *ID_Generator);

    // 绘制接口
    virtual void Show(void);
};

// CSV 列输出接口
class CSV_Column_Output_Connector : public Abs_Connector
{
public:
    // 显式禁用默认构造
    CSV_Column_Output_Connector() = delete;

    // 必要构造
    explicit CSV_Column_Output_Connector(Independent_ID_Generator *ID_Generator);

    // 绘制接口
    virtual void Show(void);
};

// ====================================节点类声明================================================

// 接口测试节点
class Connector_Test_Node : public Abs_Node
{
public:
    // 显式禁用默认构造
    Connector_Test_Node() = delete;

    // 必要构造
    Connector_Test_Node(Independent_ID_Generator *Node_ID_Generator,
                        Independent_ID_Generator *Connector_ID_Generator,
                        ImVec2 initial_position = ImVec2(0, 0));

    // 绘制节点
    virtual void Show(void);

    // 执行处理流程
    virtual bool Execute_Process(void);
};

// DLT信息输入类，起始点
class MSG_Input_Node : public Abs_Node
{
public:
    // 显式禁用默认构造
    MSG_Input_Node() = delete;

    // 必要构造
    MSG_Input_Node(Independent_ID_Generator *Node_ID_Generator,
                   Independent_ID_Generator *Connector_ID_Generator,
                   ImVec2 initial_position = ImVec2(0, 0));

    // 绘制节点
    virtual void Show(void);

    // 执行处理流程
    virtual bool Execute_Process(void);
};

#endif