#ifndef MODULE_ATTENDANCE_PERSON_H
#define MODULE_ATTENDANCE_PERSON_H

/**
  *@brief 人员考勤模块 2018-08-26 戴月腾修改
  *主要是针对人卡进行考勤，人卡从井上切换到井下为考勤开始，人卡从井下切换到井上为考勤结束
  *@author 陈欧美
  *@date 2018-08-03
*/

#include<rapidjson/document.h>
#include<rapidjson/prettywriter.h>
#include<rapidjson/stringbuffer.h>
#include "card.h"
#include"module_singleton_base.h"
#include "websocket/sio/sio_client.h"

/**
 * @brief 主要是针对人卡进行考勤，人卡从井上切换到井下为考勤开始，人卡从井下切换到井上为考勤结束
 */
class module_attendance_person:public singleton_base<module_attendance_person>
{
private:
    friend class singleton_base<module_attendance_person>;
    module_attendance_person()
    {
    }

public:
    /**
     * @brief 进入分站覆盖区域处理，考勤
     * @param card_ptr
     * @param site_ptr
     */
    void enter_site(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<site> site_ptr);

    /**
     * @brief 离开现有分站处理，记录现有分站的进出时间和地点
     * @param card_ptr
     * @param site_ptr
     */
    void leave_site(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<site> site_ptr);

    ///升井或收到web的删除卡命令  site_ptr==nullptr表示收到web的删除卡命令
    /// 保存考勤记录，发升井json，清理卡
    static void up_mine(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<site> site_ptr);

    /**
     * @brief 手工升井函数
     */
    void handle_up_mine(sio::message::ptr const& data);

private:
    ///升井json
    static void _to_json_card_up_one(std::shared_ptr<card_location_base> card_ptr,
                                       rapidjson::Value& out_datas, rapidjson::Document::AllocatorType& allocator);
};

#endif // MODULE_ATTENDANCE_PERSON_H
