#include "readconfig.h"
#include <QXmlStreamReader>
#include <QFile>
#include <QApplication>
#include <QDebug>
ReadConfig *ReadConfig::m_pInstance = NULL;
QMutex ReadConfig::mutex;

//#pragma execution_character_set("utf-8")

ReadConfig::ReadConfig()
{
    //    readConfigFile();
}
bool ReadConfig::readConfigFile()
{

    QString fileName = "./DependFile/ConfigFile/config.xml";

    QFile configFile(fileName);

    if(!configFile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug()<<"配置文件打开失败";
        return false;
    }

    QXmlStreamReader reader(&configFile);
    while(!reader.atEnd())
    {
        QXmlStreamReader::TokenType nType = reader.readNext();
        switch(nType)
        {
        case QXmlStreamReader::StartDocument:   //开始元素
        {
            QString strVersion = reader.documentVersion().toString();
            QString strEncoding = reader.documentEncoding().toString();
            bool bAlone = reader.isStandaloneDocument();
            break;
        }
        case QXmlStreamReader::Comment://注释
        {
            QString strComment = reader.text().toString();
            break;
        }
        case QXmlStreamReader::ProcessingInstruction://处理指令
        {
            QString strProInstr = reader.processingInstructionData().toString();
            break;
        }
        case QXmlStreamReader::DTD://DTD标识
        {
            QString strDTD = reader.text().toString();
            QXmlStreamNotationDeclarations notations = reader.notationDeclarations();
            QXmlStreamEntityDeclarations entity = reader.entityDeclarations();
            //DTD声明
            QString strDTDName = reader.dtdName().toString();
            QString strDTDPublicId = reader.dtdPublicId().toString();//DTD公开标识
            QString strDTDSystemId = reader.dtdSystemId().toString();//DTD系统标识
            break;
        }
        case QXmlStreamReader::StartElement://开始元素
        {
            QString strElementName = reader.name().toString();
            if(QString::compare(strElementName,"config") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();

            }
            else if(QString::compare(strElementName,"tcpAddress") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("IP"))
                {
                    st_configData.tcpIP = attributes.value("IP").toString();
                }
                if(attributes.hasAttribute("port"))
                {
                    st_configData.tcpPort = attributes.value("port").toInt();
                }
            }
            else if(QString::compare(strElementName,"udpServerAddress") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("IP"))
                {
                    st_configData.udpServerIP = attributes.value("IP").toString();
                }
                if(attributes.hasAttribute("port"))
                {
                    st_configData.udpServerPort = attributes.value("port").toInt();
                }
            }
            else if(QString::compare(strElementName,"udpClientAddress") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("IP"))
                {
                    st_configData.udpClientIP = attributes.value("IP").toString();
                }
                if(attributes.hasAttribute("port"))
                {
                    st_configData.udpClientPort = attributes.value("port").toInt();
                }
            }
            //与游戏通信的上位机
            else if(QString::compare(strElementName,"udpGameServerAddress") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("IP"))
                {
                    st_configData.udpGameServerIP = attributes.value("IP").toString();
                }
                if(attributes.hasAttribute("port"))
                {
                    st_configData.udpGameServerPort = attributes.value("port").toInt();
                }
            }
            //与上位机通信的游戏
            else if(QString::compare(strElementName,"udpGameClientAddress") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("IP"))
                {
                    st_configData.udpGameClientIP = attributes.value("IP").toString();
                }
                if(attributes.hasAttribute("port"))
                {
                    st_configData.udpGameClientPort = attributes.value("port").toInt();
                }
            }
            //与下位机通信的串口
            else if(QString::compare(strElementName,"serialPort") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("portName"))
                {
                    st_configData.serialConfig.portName = attributes.value("portName").toString();
                }
                if(attributes.hasAttribute("baud"))
                {
                    st_configData.serialConfig.baud = attributes.value("baud").toInt();
                }
                if(attributes.hasAttribute("dataBits"))
                {
                    st_configData.serialConfig.dataBits = attributes.value("dataBits").toInt();
                }
                if(attributes.hasAttribute("parity"))
                {
                    st_configData.serialConfig.parity = attributes.value("parity").toInt();
                }
                if(attributes.hasAttribute("stopBit"))
                {
                    st_configData.serialConfig.stopBit = attributes.value("stopBit").toInt();
                }
                if(attributes.hasAttribute("flowControl"))
                {
                    st_configData.serialConfig.flowControl = attributes.value("flowControl").toInt();
                }
            }
            //电刺激A串口
            else if(QString::compare(strElementName,"serialPortA") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("portName"))
                {
                    st_configData.fesASerialConfig.portName = attributes.value("portName").toString();
                }
                if(attributes.hasAttribute("baud"))
                {
                    st_configData.fesASerialConfig.baud = attributes.value("baud").toInt();
                }
                if(attributes.hasAttribute("dataBits"))
                {
                    st_configData.fesASerialConfig.dataBits = attributes.value("dataBits").toInt();
                }
                if(attributes.hasAttribute("parity"))
                {
                    st_configData.fesASerialConfig.parity = attributes.value("parity").toInt();
                }
                if(attributes.hasAttribute("stopBit"))
                {
                    st_configData.fesASerialConfig.stopBit = attributes.value("stopBit").toInt();
                }
                if(attributes.hasAttribute("flowControl"))
                {
                    st_configData.fesASerialConfig.flowControl = attributes.value("flowControl").toInt();
                }
            }
            else if(QString::compare(strElementName,"serialPortB") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("portName"))
                {
                    st_configData.fesBSerialConfig.portName = attributes.value("portName").toString();
                }
                if(attributes.hasAttribute("baud"))
                {
                    st_configData.fesBSerialConfig.baud = attributes.value("baud").toInt();
                }
                if(attributes.hasAttribute("dataBits"))
                {
                    st_configData.fesBSerialConfig.dataBits = attributes.value("dataBits").toInt();
                }
                if(attributes.hasAttribute("parity"))
                {
                    st_configData.fesBSerialConfig.parity = attributes.value("parity").toInt();
                }
                if(attributes.hasAttribute("stopBit"))
                {
                    st_configData.fesBSerialConfig.stopBit = attributes.value("stopBit").toInt();
                }
                if(attributes.hasAttribute("flowControl"))
                {
                    st_configData.fesBSerialConfig.flowControl = attributes.value("flowControl").toInt();
                }
            }
            else if(QString::compare(strElementName,"dataBase") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("IP"))
                {
                    st_configData.dataBaseConfig.IP = attributes.value("IP").toString();
                }
                if(attributes.hasAttribute("port"))
                {
                    st_configData.dataBaseConfig.port = attributes.value("port").toInt();
                }
                if(attributes.hasAttribute("userName"))
                {
                    st_configData.dataBaseConfig.userName = attributes.value("userName").toString();
                }
                if(attributes.hasAttribute("password"))
                {
                    st_configData.dataBaseConfig.password = attributes.value("password").toString();
                }
            }
            else if(QString::compare(strElementName,"communicateType") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("type"))
                    st_configData.communicateType = attributes.value("type").toInt();
            }
            else if(QString::compare(strElementName,"videoTips") == 0)
            {
                QXmlStreamAttributes attributes = reader.attributes();
                if(attributes.hasAttribute("videoPath"))
                {
                    st_configData.videoPath = attributes.value("videoPath").toString();
                }
                if(attributes.hasAttribute("videoNum"))
                {

                }

                if(strElementName == "videoContent")
                {
                    qDebug()<<"########";
                }
            }
            break;

        }
        case QXmlStreamReader::EndDocument://结束文档
        {
            break;
        }
        default:
            break;
        }
    }
    configFile.close();

    if(reader.hasError())
    {
        qDebug()<<QString::fromLocal8Bit("错误信息:%1 行号:%2 列号:%3 字符移位:%4").arg(reader.errorString())
                  .arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset());
        return false;
    }

    return true;
}

bool ReadConfig::getFesASerialPortConfig(ST_SerialPortConfig &serialConfig)
{
    serialConfig = st_configData.fesASerialConfig;
    if(!serialConfig.portName.isEmpty() && serialConfig.baud != 0)
    {
        return true;
    }
    else
        return false;
}
//获取实例
ReadConfig* ReadConfig::getInstance()
{
    QMutexLocker mutexLocker(&mutex);
    if(!m_pInstance)
    {
        m_pInstance = new ReadConfig();
    }
    return m_pInstance;
}

//获取通信方式
int ReadConfig::getCommunicateType()
{
    return st_configData.communicateType;
}

//获取UDP地址信息
bool ReadConfig::getUdpServerAddress(int16_t &port,QString &IP)
{
    port = st_configData.udpServerPort;
    IP = st_configData.udpServerIP;

    if(port != 0 && !IP.isEmpty())
        return true;
    else
        return false;
}

bool ReadConfig::getUdpClientAddress(int16_t &port,QString &IP)
{
    port = st_configData.udpClientPort;
    IP = st_configData.udpClientIP;

    if(port != 0 && !IP.isEmpty())
        return true;
    else
        return false;
}

//获取TCP地址信息
bool ReadConfig::getTcpAddress(int16_t &port,QString &IP)
{
    port = st_configData.tcpPort;
    IP = st_configData.tcpIP;

    if(port != 0 && !IP.isEmpty())
        return true;
    else
        return false;
}
//获取串口信息
bool ReadConfig::getSerialPortConfig(ST_SerialPortConfig &serialConfig)
{
    serialConfig = st_configData.serialConfig;
    if(!serialConfig.portName.isEmpty() && serialConfig.baud != 0)
    {
        return true;
    }
    else
        return false;
}
//获取数据库配置
bool ReadConfig::getDataBaseConfig(ST_DataBaseConfig &databaseConfig)
{
    databaseConfig = st_configData.dataBaseConfig;
    if(!databaseConfig.IP.isEmpty())
        return true;
    else
        return false;
}

bool ReadConfig::getGameServerAddress(int16_t &port,QString& IP)
{
    port = st_configData.udpGameServerPort;
    IP = st_configData.udpGameServerIP;
    return true;
}

bool ReadConfig::getGameClientAddress(int16_t &port,QString& IP)
{
    port = st_configData.udpGameClientPort;
    IP = st_configData.udpGameClientIP;
    return true;
}