#ifndef MODULE_ATTENDANCE_PERSON_H
#define MODULE_ATTENDANCE_PERSON_H

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

#include <memory>
#include <mutex>
#include <map>
#include <string>
#include <chrono>
#include <vector>
#include<card.h>
#include"ant.h"
#include"area.h"
#include"site_area.h"
#include"module_const.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_id
     * @param enter_site
     */
    void enter_site(uint64_t card_id,int enter_site)
    {
        auto card_ptr=card_list::instance()->get(card_id);
        if(!card_ptr)
        {
            log_error("卡不存在card_id=%d", card_id);
            return;
        }

        auto site_ptr=sit_list::instance()->get(enter_site);
        if(!site_ptr)
        {
            log_error("在分站列表中找不到分站，分站id=%d", enter_site);
            return;
        }

        card_ptr->m_site_id = enter_site;

        // 从井下切换到井上为考勤结束
        if(UP_SITE==site_ptr->m_up_down)
        {
            if(AS_ATTENDANCE == card_ptr->m_stat_attendance)
            {
                //考勤结束
                card_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;

                //作为一条结束考勤记录保存到数据库
                tool_db::save_attendance(card_ptr);
            }
        }

        // 从井上切换到井下为考勤开始
        if(DOWN_SITE==site_ptr->m_up_down)
        {
            if(AS_ATTENDANCE != card_ptr->m_stat_attendance)
            {
                //考勤开始
                card_ptr->m_stat_attendance=AS_ATTENDANCE;
                card_ptr->m_attendance_start_time=std::chrono::system_clock::now();

                //作为一条开始考勤记录保存到数据库
                tool_db::save_attendance(card_ptr);
            }
        }
    }

    /**
     * @brief 离开现有分站处理，记录现有分站的进出时间和地点
     * @param card_id
     * @param enter_site
     */
    void leave_site(uint64_t card_id,int enter_site)
    {

    }
    /**
     * @brief 手工升井函数
     */
    void up_well(std::vector<std::string>& card_ids)
    {
        //    std::chrono::system_clock::time_point time_current = std::chrono::system_clock::now();
        //    std::vector<std::string> ids;

        //    {
        //        //std::lock_guard<std::mutex> lock(m_mutex);
        //        for(auto iter = card_ids.begin(); iter != card_ids.end(); ++iter)
        //        {
        //            auto iter_card = g_card_map_ptr->find(*iter);
        //            if(g_card_map_ptr->end() == iter_card)
        //            {
        //                continue;
        //            }
        //            if(!iter_card->second->is_attendance) // 该卡当前没在井下，不能形成考勤记录
        //            {
        //                // 该卡当前没在井下，不能形成考勤记录
        //                continue;
        //            }

        ////            // 添加到考勤处理列表
        ////            iter_card->second->last_status_well = enum_status_well::STATUS_WELL_UP;
        ////            iter_card->second->time_end = time_current;
        ////            attendances.push_back(iter_card->second);

        //            ids.push_back(*iter);
        //        }
        //    }

        //    // 插入考勤记录到数据库
        //    for(auto iter = ids.begin(); iter != ids.end(); ++iter)
        //    {
        //        g_card_map_ptr->erase(*iter);

        //        // 插入考勤记录到数据库
        //    }
    }

};

#endif // MODULE_ATTENDANCE_PERSON_H
