#ifndef MODULE_MGR_H
#define MODULE_MGR_H

/**
 * @brief 业务模块的管理类,包括:
 * 1、初始化(init:注册web回调函数,读数据库初始化事件列表)
 * 2、启动线程start:向web发送事件
 * 3、结束线程stop
 * @author 戴月腾
 * @date 2018-08-25
 */

#include"module_web.h"
#include"module_area.h"
#include"module_call_help.h"
#include"module_call.h"
#include"module_over_speed_vehicle.h"
#include"module_other_alarm.h"

class module_mgr: public singleton_base<module_mgr>
{
private:
    friend class singleton_base<module_mgr>;
    module_mgr()
    {
    }

public:
    /**
     * @brief 注册web回调函数,读配置文件,启动向web发送线程
     */
    static void init(config_file& config, std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE>& MsgFuncList)
    {
        module_web::instance()->init(config, MsgFuncList);
        module_call::instance()->init(config);
    }

    /**
     * @brief 启动线程start:向web发送事件
     */
    static void start()
    {
        module_over_speed_vehicle::instance()->init_vehicle_category_from_db();
        //init_attendance_from_db();
        module_attendance_vehicle::instance()->init_attendance_area_from_db();

        module_web::instance()->start();
        module_call::instance()->start();
    }

    /**
     * @brief 结束线程stop
     */
    static void stop()
    {
        module_web::instance()->stop();
        module_call::instance()->stop();
    }

    static void do_status(STATUS_CARD st, uint32_t card_id, int32_t type)
    {
        auto card_ptr=card_list::instance()->get(card_list::to_id64(type, card_id));
        if(!card_ptr)
        {
            log_error("卡不存在card_id=%d", card_id);
            return;
        }

        if(STATUS_HELP == st)
        {
            module_call_help::instance()->rev_from_card_help(card_ptr);
        }
        if(STATUS_CALL == st)
        {
            module_call::instance()->rev_from_card_resp(card_ptr);
        }
        if(STATUS_POWER_LOWER_SERIOUS == st)
        {
            module_other_alarm::power_lower_serious(card_ptr);
        }
        if(STATUS_POWER_NOMARL == st)
        {
            module_other_alarm::power_nomarl(card_ptr);
        }
    }

//private:
//    static void init_attendance_from_db()
//    {
//        const char *sql = "select card_id, start_time, end_time from rt_att_staff;";
//        std::string Error;
//        YADB::CDBResultSet DBRes;
//        sDBConnPool.Query(sql,DBRes,Error);
//        uint64_t nCount = DBRes.GetRecordCount( Error );
//        if (nCount > 0)
//        {
//            log_info( "init_attendance. The record count=%d\n", nCount );

//            while ( DBRes.GetNextRecod(Error) )
//            {
//                std::string card_id;
//                DBRes.GetField( "card_id",card_id, Error );

//                std::string end_time;
//                DBRes.GetField( "end_time",end_time, Error );

//                if(end_time.empty())
//                {
//                    uint32_t id = tool_other::id64_to_id(card_id);
//                    int32_t type = tool_other::id64_to_type(card_id);

//                    auto card_ptr = card_list::instance()->get(card_list::to_id64(type, id));
//                    if(card_ptr)
//                    {
//                        std::string start_time;
//                        DBRes.GetField( "start_time",start_time, Error );

//                        auto mine_tool_ptr = card_ptr->get_mine_tool();

//                        mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
//                        mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
//                        //std_debug("%s",
//                        //   tool_time::to_str_ex(tool_time::to_ms(site_area_ptr->m_attendance_start_time)).c_str());
//                    }
//                }
//            }
//        }
//    }
};

#endif // MODULE_MGR_H