//
// Created by huli on 2020/7/2.
//

#ifndef NNXX_TESTS_SYSTEM_EXECUTOR_H
#define NNXX_TESTS_SYSTEM_EXECUTOR_H

#include "../tool/thread_pool.h"
#include "../tool/singleton.h"
#include "../error_code/error_code.h"
#include "../communication/communication_message.h"

#include "../tool/common_data.h"
#include "../tool/measure_filter.h"
#include "../message/measure_message.pb.h"
#include "../message/message.pb.h"
#include "../system/system_communication.h"
#include "../system/system_communication_mq.h"

#include "../wanji_lidar/wanji_manager.h"
#include "../velodyne_lidar/velodyne_manager.h"

#define DISP_TERM_ID -1
// 0wj  1velo	2both
#define WJ_VELO 2

class System_executor:public Singleton<System_executor>
{
// 子类必须把父类设定为友元函数，这样父类才能使用子类的私有构造函数。
   friend class Singleton<System_executor>;

public:
	//系统执行者的状态
	enum System_executor_status
	{//default SYSTEM_EXECUTOR_UNKNOW = 0
	    SYSTEM_EXECUTOR_UNKNOW				= 0,    //
		SYSTEM_EXECUTOR_READY				= 1,    //

		SYSTEM_EXECUTOR_FAULT				= 10,    //

	};
   
private:
 // 父类的构造函数必须保护，子类的构造函数必须私有。
   System_executor();
public:
    //必须关闭拷贝构造和赋值构造，只能通过 get_instance 函数来进行操作唯一的实例。
    System_executor(const System_executor& other) = delete;
    System_executor& operator =(const System_executor& other) = delete;
    ~System_executor();
public://API functions
	//初始化
	Error_manager system_executor_init(int threads_size, int terminal_id);
	//反初始化
	Error_manager system_executor_uninit();

	//检查消息是否有效, 主要检查消息类型和接受者, 判断这条消息是不是给我的.
	Error_manager check_msg(Communication_message* p_msg);

	//检查执行者的状态, 判断能否处理这条消息,
	Error_manager check_executer(Communication_message* p_msg);
	//处理消息的执行函数
	Error_manager execute_msg(Communication_message* p_msg);

	//检查状态
	Error_manager check_status();

	//定时发送状态信息
	Error_manager encapsulate_send_status();

	//定时发送mq状态信息
	Error_manager encapsulate_send_mq_status();

	//判断是否为待机，如果已经准备好，则可以执行任务。
	bool is_ready();

	// 更新消息中关于定位结果与超界信息的内容
	bool update_measure_info(message::Ground_status_msg &msg, Common_data::Car_wheel_information &measure_info, int cloud_size);
public://get or set member variable
	System_executor_status get_system_executor_status();
	int get_terminal_id();

public:
	//注注注注注意了, 线程池的函数独立运行,
	//传递参数, 不能使用即将销毁的内存


	//雷达感测定位 的处理函数
//input::command_id, 消息指令id, 由主控制系统生成的唯一码
//input::command_id, 终端id, 对应具体的某个车位
//return::void, 没有返回, 执行结果直接生成一条答复消息, 然后通过通信返回
	void execute_for_measure(std::string command_info, int terminal_id,std::chrono::system_clock::time_point receive_time);



protected://member variable

	System_executor_status		m_system_executor_status;		//系统执行者的状态
	
	Thread_pool 				m_thread_pool;					//执行多任务的线程池

	int 						m_terminal_id;						//终端id

private:

};


#endif //NNXX_TESTS_SYSTEM_EXECUTOR_H
