#ifndef MODULE_ATTENDANCE_VEHICLE_H
#define MODULE_ATTENDANCE_VEHICLE_H

/**
  *@brief 车辆考勤模块
  *车辆进入某些特定区域，结束考勤；从特定区域进入其他区域，开始考勤
  *@author 戴月腾
  *@date 2018-08-07
*/

#include<unordered_map>
#include "module_singleton_base.h"
#include "card.h"
#include"area.h"


/**
 * @brief 车辆进入某些特定区域，结束考勤；从特定区域进入其他区域，开始考勤, 单例
 */
class module_attendance_vehicle:public singleton_base<module_attendance_vehicle>
{
private:
    friend class singleton_base<module_attendance_vehicle>;
    module_attendance_vehicle()
    {
    }

public:
    void on_enter(std::shared_ptr<card_location_base> card_ptr, int index);
    void on_hover(std::shared_ptr<card_location_base> card_ptr, int index);
    void on_leave(std::shared_ptr<card_location_base> card_ptr, int index);

    void on_enter(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<area_hover>&c);

    void init_attendance_area_from_db();

    ///area_ptr==nullptr 表示接收到 web的删除卡命令
    static void save_attendance(std::shared_ptr<card_location_base>& card_ptr, std::shared_ptr<area> area_ptr);

private:
    bool is_not_attendance_area(int area_id, int vehicle_type_id)
    {
        return  m_map.end() != m_map.find(to_list_id(area_id, vehicle_type_id));
    }

    uint64_t to_list_id(int area_id, int vehicle_type_id)
    {
        return (static_cast<uint64_t>(area_id)<<32) | static_cast<uint64_t>(vehicle_type_id);
    }

    ///area_id<<32| vehicle_type_id; att_rule_id
    std::unordered_map<uint64_t, int> m_map;
};

#endif // MODULE_ATTENDANCE_VEHICLE_H
