#if !defined(_UTILLBASE_HPP_)
#define _UTILLBASE_HPP_

#include <iostream>
#include <ctime>
#include <memory>
#include <vector>

#include "SendDevice.h"
#include "NonCopyAble.hpp"

namespace gsd{

    /**
     * @brief 控制设备基础
     * 
     */    
    class ContorlGear:private NonCopyAble
    {
        
    public:
        struct ControlerMsg
        {   
            int deviceId;
            uint8_t msgId;
            uint8_t data;
        };

        enum DeviceTools{
            serial = 0,
            http = 1,
            tcp = 2
        };

    protected:
        std::string deviceId;
        std::string DeviceInfo = "";
        enum DeviceTools tool = DeviceTools::serial;

    public:
        ContorlGear(){}
        ~ContorlGear(){}

        /**
         * @description: 序列化
         * @return {*}
         */        
        virtual bool serialization(){
            return true;
        }

        /**
         * @description: 反序列化
         * @return {*}
         */        
        virtual bool deserialization(){
            return true;
        }
        
        /**
         * @description: 消费数据
         * @param {uint8_t} *data
         * @param {int} len
         * @param {int} &msg_id
         * @return {*}
         */        
        virtual bool Consumer(uint8_t *data, int len, int &msg_id){
            return true;
        }

        /**
         * @description: 设备响应码是否为状态码
         * @param {int} &msg_id
         * @return {*}
         */        
        virtual bool getStatusMsg(int &msg_id){ 
            return false;
        };

        /**
         * @description: 构建设备信息
         * @param {SendDevice&} sendDevice
         * @return {*}
         */        
        virtual void BuildDeviceInfo(SendDevice& sendDevice) {};

        /**
         * @description: 常规控制
         * @param {string} _deviceId 设备Id
         * @param {uint8_t*} data 数据
         * @param {int&} length 数据长度
         * @return {*}
         */        
        virtual int8_t Open(std::string _deviceId,uint8_t* data, int& length){return 0;};
        virtual int8_t Close(std::string _deviceId, uint8_t* data, int&length){return 0;};
        virtual int8_t Fire(std::string _deviceId, uint8_t* data, int& length){return 0;};
        virtual int8_t Status(std::string _deviceId, uint8_t* data, int& length){return 0;};

        /**
         * @description: 设置设备ID
         * @param {string} DeviceId
         * @return {*}
         */        
        void setDeviceId(std::string DeviceId){
            deviceId = DeviceId;
        }

        /**
         * @description: 获取设备ID
         * @return {*}
         */        
        std::string getDeviceId(){
            return deviceId;
        }

        /**
         * @description: 获取设备工具
         * @return {*}
         */        
        enum DeviceTools getDeviceTool(){
            return tool;
        }

        /**
         * @description: 获取数据信息
         * @return {*}
         */        
        std::string getDeviceInfo(){
            return DeviceInfo;
        }
    };

    /**
     * @brief 串口工具
     * 
     */    
    class ContorlSerialBase:public ContorlGear
    {
    protected:
        int baudRate;

    public:
        ContorlSerialBase(){}
        ~ContorlSerialBase(){}

        /**
         * @description: 获取波特率
         * @return {*}
         */        
        int getBaudRate(){
            return this->baudRate;
        }
    };

    /**
     * @brief ContorlHttplBase
     * 
     */    
    class ContorlHttplBase: public ContorlGear
    {
    protected:
        std::string serverIP;
        int port;
        std::string serverCname;
        std::string serverCpwd;
    public:
        ContorlHttplBase(){}
        ~ContorlHttplBase(){}

        void setServerIP(std::string _serverIP){
            serverIP = _serverIP;
        }

        void setServerCname(std::string _serverCname){
            serverCname = _serverCname;
        }

        void setServerCpwd(std::string _serverCpwd){
            serverCpwd = _serverCpwd;
        }
    };

    /**
     * @brief ModuleBase
     * 
     */    
    class ModuleBase: private NonCopyAble
    {
    public:
        ModuleBase(){}
        ~ModuleBase(){}

        /**
         * @description: 初始化
         * @return {*}
         */        
        virtual bool Init() = 0;

        /**
         * @description: 释放
         * @return {*}
         */        
        virtual void Destroy() = 0;
    };
    
    /**
     * @brief PlginsBase
     * 
     */    
    class PluginBase: private ModuleBase
    {
    private:
        /* data */
    public:
        PluginBase(){}
        ~PluginBase(){}

        /**
         * @description: StartTask
         * @return {*}
         */        
        virtual bool StartTask() = 0;
        
        /**
         * @description: Alive
         * @return {*}
         */        
        virtual bool Alive() = 0;
    };

};

#endif // _UTILLBASE_HPP_