/*
 * @Description: 
 * @Version: 1.0
 * @Autor: lishengyin
 * @Date: 2022-01-11 11:47:37
 * @LastEditors: lishengyin
 * @LastEditTime: 2022-01-18 09:58:52
 */
#pragma once

#include <iostream>
#include <iostream>
#include <map>
#include <time.h>
#include <dirent.h>
#include <time.h>
#include <cstdlib>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include "Util/logger.h"
#include "Util/NoticeCenter.h"
#include "Poller/EventPoller.h"
#include "Player/PlayerProxy.h"
#include "Rtmp/RtmpPusher.h"
#include "Common/config.h"
#include "Pusher/MediaPusher.h"
#include "Extension/Frame.h"
#include "Util/SqlPool.h"
#include "Network/TcpClient.h"
#include "Poller/Timer.h"
#include "monitor.h"
#include "Notices.h"
#include "inference.h"
#include "deviceState.h"


using namespace toolkit;
using namespace std;

namespace MIVA{
    class Manager
    {
    private:
        int MemoryThreshold;
        int TempThreshold;
        int FdThreshold;
        int ResetThreshold = 100;
        bool ResetSwitch = false;
        int TimeoutThreshold = 3;
    private:

        /**
         * @description: 获取fd的判定结果
         * @param {*}
         * @return {*}
         */        
        bool decideFdResult();

        /**
         * @description: 获取内存的判定结果
         * @param {*}
         * @return {*}
         */        
        bool decideMemoryResult();

        /**
         * @description: 获取温度判定结果
         * @param {*}
         * @return {*}
         */        
        bool decideTempResult();

        /**
         * @description: 判定播放的结果
         * @param {*}
         * @return {*}
         */        
        bool decidePlayResult();

        /**
         * @description: 获取重置的判定结果
         * @param {*}
         * @return {*}
         */        
        bool decideResetResult();

        /**
         * @description: 获取超时的判定结果
         * @param {*}
         * @return {*}
         */        
        bool decideTimeoutResult();

    public:
        Manager();
        ~Manager();

        /**
         * @description: 创建实例
         * @param {*}
         * @return {*}
         */        
        static std::shared_ptr<Manager> CreateNew();

        /**
         * @description: 设置MemoryThreshold
         * @param {int} MemoryThreshold
         * @return {*}
         */        
        void setMemoryThreshold(int memoryThreshold);

        /**
         * @description: 设置温度阈值
         * @param {int} TempThreshold
         * @return {*}
         */        
        void setTempThreshold(int tempThreshold);

        /**
         * @description: 设置fd阈值
         * @param {int} fdThreshold
         * @return {*}
         */        
        void setFdThreshold(int fdThreshold);

        /**
         * @description: 设置重启阈值
         * @param {int} resetThreshold
         * @return {*}
         */        
        void setResetThreshold(int resetThreshold);

        /**
         * @description: 设置重启开关
         * @param {bool} resetSwich
         * @return {*}
         */        
        void setResetSwitch(bool resetSwitch);

        /**
         * @description: 设置超时阈值
         * @param {int} timeoutThreshold
         * @return {*}
         */        
        void setTimeoutThreshold(int timeoutThreshold);

        /**
         * @description: 纪律超时
         * @param {*}
         * @return {*}
         */        
        void recordTimeOut();

        /**
         * @description: 清除超时
         * @param {*}
         * @return {*}
         */        
        void clearRecordTimeOut();

        /**
         * @description: 获取启动资格
         * @param {*}
         * @return {*}
         */        
        int32_t getStartPower();

        /**
         * @description: 获取停止的资格
         * @param {*}
         * @return {*}
         */        
        int32_t getStopPower();

        /**
         * @description: 获取清理的资格
         * @param {*}
         * @return {*}
         */        
        int32_t getClearPower();

        /**
         * @description: 获取同步数据的资格
         * @param {*}
         * @return {*}
         */        
        int32_t getSyncDataPower();

        /**
         * @description: 获取上层数据的资格
         * @param {*}
         * @return {*}
         */        
        int32_t getHostDataPower();

        /**
         * @description: 获取同步FdThreshold的资格
         * @param {*}
         * @return {*}
         */        
        int32_t getSyncFdThresholdPower();

        /**
         * @description: 获取重启的资格
         * @param {*}
         * @return {*}
         */        
        int32_t getResetPower();

        /**
         * @description: 重启
         * @param {*}
         * @return {*}
         */        
        void Reset();
        
    public:
        using Ptr = std::shared_ptr<Manager>;
    };
}