/*
** 井中卡的数据：人员下井 ，人员升进，车下井升井数据
** 对应的操作，井下人员超时，井下超员等
*/
#ifndef __MINECARDMANAGER_H
#define __MINECARDMANAGER_H

#include "minestruct.h"
#include "card.h"
#include "module_service/module_const.h"

//井下警告类型数量
#define MAX_MINE_EVENT_NUM 3

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

private:
    std::shared_ptr<mine_card_info> m_minecards;

    //井下警告列表ID(下标为实践类型)
    uint64_t m_evlist[MAX_MINE_EVENT_NUM];
private:
    /**
     * @brief 获取事件ID
     **/
    uint64_t GetMineEventId(int evType);
    /**
     * @brief 判断是否已存在
     **/
    bool Exist(SET_CARDID &list,uint64_t id);
    bool Exist(SET_CARDID &list,int card_id,int card_type);
     /**
     * @brief 创建警告事件
     * @param evType 警告类型
     * @param limitVal 限制数据(阀门值)
     * @param curVal 当前数据
     **/
    void StartEvent(int evType,int limitVal,int curVal);
    /**
     * @brief 取消警告事件
     * @param evType 警告类型
     * @param curVal 当前数据
     **/
    void CancelEvent(int evType,int curVal);
public:
    //TODO: 获取信息
    std::shared_ptr<mine_card_info> GetMineCards() ;
    /**
     * @brief 人员下井,超员警告
     * @param card 卡
     * @param bInit 是否初始化(程序启动加载井下人员)
     **/
    void OnPersonDown(std::shared_ptr<card> card,bool bInit = false);
     /**
     * @brief 人员升井,取消超员警告
     * @param card 卡
     **/
    void OnPersonUp(std::shared_ptr<card> card);
     /**
     * @brief 人员超员警告
     **/
    void OnPersonOvercrowdingWarning();

    /**
     * @brief 人员井下超时
     **/
    void OnPersonInMineOverTime(int card_id,int card_type);
public:
     /**
     * @brief 车下井 ,车辆超员警告
     * @param card 卡
     * @param bInit 是否初始化(程序启动加载井下车辆)
     **/
    void OnVehicleDown(std::shared_ptr<card> card,bool bInit = false);
     /**
     * @brief 车升井,车辆超员警告取消
     * @param card 卡
     **/
    void OnVehicleUp(std::shared_ptr<card> card);
    /**
     * @brief 车辆超员警告
     **/
    void OnVehicleOvercrowdingWarning();


};

#endif //__MINECARDMANAGER_H
