#ifndef MODULE_AREA_H
#define MODULE_AREA_H

/**
 * @brief 与区域相关的业务模块总接口
 * @author 戴月腾
 * @date 2018-08-25
 */

#include"area.h"
#include"module_const.h"
#include"module_web.h"

class module_area:public i_thread, public singleton_base<module_area>
{
private:
    friend class singleton_base<module_area>;
    module_area()
    {
    }

public:
    void on_hover(uint64_t card_id,std::shared_ptr<area_hover>&c,double speed);
    void on_enter(uint64_t card_id,std::shared_ptr<area_hover>&c,double speed);
    void on_leave(uint64_t card_id,std::shared_ptr<area_hover>&c,double speed);

    /**
     * @brief 读取数据库中的告警，初始化告警列表
     */
    void init()
    {}

    /**
     * @brief web前端有用户登录时，反馈给web所有信息
     */
    std::string response_login()
    {
        std::vector<std::shared_ptr<ya_event>> arr;
        get_all_events(arr);

        if(!arr.empty())//发送给web端
        {
            return tool_json::evs_to_json(arr);
        }

        return "";
    }
private:
    /**
     * @brief 线程函数
     */
    void run()
    {
        std::vector<std::shared_ptr<ya_event>> arr;
        get_all_events(arr);

        if(!arr.empty())//发送给web端
        {
            swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::evs_to_json(arr));
        }
    }

    /**
     * @brief 获取所有的告警事件
     * @param out_data
     */
    void get_all_events(std::vector<std::shared_ptr<ya_event>>& arr)
    {
        {
            std::lock_guard<std::mutex> lock(_mutex);

            auto it_map = _map.begin();
            for(;it_map!=_map.end();++it_map)
            {
                arr.push_back(it_map->second);
                if(ES_DEAL_HELP== it_map->second->m_status)//删除掉已经处理的
                {
                    _map.erase(it_map--);
                }
            }
        }
    }

    std::map<uint64_t, std::shared_ptr<ya_event>> _map;
};

#endif // MODULE_AREA_H
