/*
回复油气回收在线监控站级系统定义
TOKEN_NULL_R 获取token无效
CONNECT_ERROR_T 连接第三方服务器失败
INTERFACE_UNDEFINED 接口未定义
*/

require('./HtmlServer.js')

var crypto = require('crypto');

const EventEmitter = require('events');
const emitter = new EventEmitter()
emitter.setMaxListeners(100)

// var MongoClient = require('mongodb').MongoClient;
// var dburl = "mongodb://localhost:27017/vr";
// MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) {
//     if (err) throw err;
//     console.log("数据库已创建!");
// });

var mysql = require('mysql');
var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'HS1205',
    database: 'vr'
});

connection.connect();


//log
var sd = require('silly-datetime');
var time = sd.format(new Date(), 'YYYY-MM-DD');

const log4js = require('log4js');
log4js.configure({
    appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } },
    categories: { default: { appenders: ['WebLog'], level: 'trace' } }
});
const log = log4js.getLogger('WebLog');
console.log('服务器启动!');
log.trace('服务器启动!');

var logs = [];

var oneSecond = 1000;
setInterval(function () {
    var time2 = sd.format(new Date(), 'YYYY-MM-DD');
    if (time2 != time) {
        log4js.configure({
            appenders: { WebLog: { type: 'file', filename: './WebLog/' + time2 + '.log' } },
            categories: { default: { appenders: ['WebLog'], level: 'trace' } }
        });
        time = time2;
    }
}, oneSecond);


var http0 = require('http');
var qs = require('querystring');
var options = {
    hostname: '101.231.215.60',
    port: 15780,
    path: '/eldf.portal-service/auth/equipmentLogin',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
};

function prehandle(key, ra, json, inf) {
    var path;
    var ip;
    if (ra) {
        if (ra == '::1') {
            ip = 'localhost'
            path = key + ' ' + ip;
        }
        else {
            ip = ra.split('::')[1].split(':')[1]
            path = key + ' ' + ip;
        }
    }
    else {
        console.log('ra 无定义');
        return;
    }
    console.log(path);
    log4js.configure({
        appenders: { WebLog: { type: 'file', filename: './WebLog/' + path + '/' + time + '.log' } },
        categories: { default: { appenders: ['WebLog'], level: 'trace' } }
    });


    if (inf == 'GSRecycleDataEvent' || inf == 'GSAlarmDataEvent' || inf == 'GSConfigurationDataEvent') {
        var e0 = Buffer(JSON.parse(json)['message']['busObject'], 'base64').toString();
        e0 = JSON.parse(e0);
        e0['userid'] = key;
        e0['ip'] = ip;

        var setname;
        if (inf == 'GSRecycleDataEvent') {
            setname = 'record'
        }
        else if (inf == 'GSAlarmDataEvent') {
            setname = 'warning'
        }
        else if (inf == 'GSConfigurationDataEvent') {
            setname = 'config'
        }

        if (setname == 'record') {

            var addSql = 'INSERT INTO t_records(GID,id,name,fip,noz,vlr,yll,qll,time,ip) VALUES(0,?,?,?,?,?,?,?,?,?)';
            //var addSqlParams = [2, '', 2, 2, 0.9, , , '2019-03-05 17:05:10', 'local'];
            var addSqlParams = [e0.userid, "", e0.jyjid, e0.jyqid, e0.al,e0.yll ,e0.qll , e0.monitorTime, e0.ip];
            //增
            connection.query(addSql, addSqlParams, function (err, result) {
                if (err) {
                    console.log('[INSERT ERROR] - ', err.message);
                    return;
                }

                console.log('--------------------------INSERT----------------------------');
                //console.log('INSERT ID:',result.insertId);        
                console.log('INSERT ID:', result);
                console.log('-----------------------------------------------------------------\n\n');
            });

        }


        // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) {
        //     if (err) throw err;

        //     var dbo = db.db("vr");
        //     var myobj = e0;
        //     dbo.collection(setname).insertOne(myobj, function (err, res) {
        //         if (err) throw err;
        //         console.log(setname + "插入数据库成功");
        //         db.close();
        //     });

        // });
    }
    else if (inf == 'GSEnvironmentDataEvent') {
        var e0 = Buffer(JSON.parse(json)['message']['busObject'], 'base64').toString();
        e0 = JSON.parse(e0);

        var e2 = [];
        for (var i = 0; i < e0.length; i++) {
            var e1 = e0[i];
            e1['userid'] = key;
            e1['ip'] = ip;
            e2.push(e1);
        }
        // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) {
        //     if (err) throw err;

        //     var dbo = db.db("vr");
        //     var myobj = e2;
        //     dbo.collection("envir").insertMany(myobj, function (err, res) {
        //         if (err) throw err;
        //         console.log("环境数据插入成功");
        //         db.close();
        //     });

        // });
    }

}


function SendData(params, res, key) {
    //计算hamc
    var readjson = JSON.parse(params.query.json);
    var caldata = JSON.stringify((JSON.parse(params.query.json))['message']);
    var hashread = crypto.createHmac('SHA256', "aEUjjsauUjK93").update(caldata).digest('hex');
    readjson['hmac'] = hashread;
    var sendjson = JSON.stringify(readjson);
    var sendData = sendjson;

    //向第三方服务器发送数据
    sendcount_++
    console.log(`${sendcount_} send`)
    times[sendcount_] = new Date();
    socket[key].emit(params.query.in, sendData, function (data) {  //data为服务器端返回的数据
        console.log('收到远程返回数据:' + data);
        log.trace('收到远程返回数据' + data);

        //将第三方服务器返回的数据发回给http client,即油气回收在线监控站级系统
        res.setHeader("content-type", "text/html;charset=UTF-8")
        res.end(data)

        recvcount++;
        console.log(`${recvcount} recv`)
        if (times[recvcount]) {
            console.log(`耗时 ${(new Date()).getTime() - times[recvcount].getTime()} ms`)
        }
        else {
            console.log('没找到对应的sendcount_')
        }
    });
}


var client = [];
var socket = [];
var clientcount = 0;
var sendcount_ = 0;
var recvcount = 0;
var times = [];

var con = require('./conn.js');


function Timer_Main(Interval) {

}
var myInterval_main = setInterval(Timer_Main, 1000, "");


const http = require("http")
const url = require("url")
const queryString = require("querystring")

//建立http server,监听来自http client,即油气回收站级系统的数据
const server = http.createServer((req, res) => {
    //req.url 请求的URL
    // GET QUERY params
    res.setHeader("Access-Control-Allow-Origin", "*");
    let methods = req.method;

    if (methods == "GET") {
        let params = url.parse(req.url, true, true);


        if (params.href == "/favicon.ico") {
            return;
        }
        else {



            var cityno = params.query.cityno;
            if (cityno == "0") {
                if (!params.query.id || params.query.id == '' || params.query.id == '0') {
                    console.log('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
                    log.trace('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
                    return;
                }


                var key = params.query.id;
                prehandle(key, req.connection.remoteAddress, params.query.json, params.query.in)

                console.log('收到客户端请求数据:' + params.query.json);
                log.trace('收到客户端请求数据' + params.query.json);
                clientcount++;
                console.log('clientcount:', clientcount);



                res.setHeader("content-type", "text/html;charset=UTF-8")
                res.end('data')


                return;
            }
            else if (cityno == "1") {
                if (!params.query.cc || params.query.cc == '') {

                    log4js.configure({
                        appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } },
                        categories: { default: { appenders: ['WebLog'], level: 'trace' } }
                    });

                    console.log('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
                    log.trace('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
                    return;
                }
            }
            else {

                log4js.configure({
                    appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } },
                    categories: { default: { appenders: ['WebLog'], level: 'trace' } }
                });

                console.log('无效的城市标识' + req.headers.host + ' ' + cityno);
                log.trace('无效的城市标识' + req.headers.host + ' ' + cityno);
                return;
            }
        }

        var key = params.query.cc; //不同客户端的唯一标识,目前还未最终确定,先用cc




        if (!client[key])   //第一次收到某客户端的数据
        {
            var user = {};
            user.cc = params.query.cc;
            user.un = params.query.un;
            user.pw = params.query.pw;
            user.hmac = Buffer(params.query.hc, 'base64').toString();
            user.ConnectState = false;
            client[key] = user;


        }
        else {
            if (socket[key]) {
                client[key].ConnectState = socket[key].connected;
            }
            else {
                client[key].ConnectState = false;
            }
        }



        prehandle(key, req.connection.remoteAddress, params.query.json, params.query.in)


        console.log('收到客户端请求数据:' + params.query.json);
        log.trace('收到客户端请求数据' + params.query.json);
        clientcount++;
        console.log('clientcount:', clientcount);

        if (client[key].ConnectState == false) {
            //获取tocken
            var tokenreq = http0.request(options, function (res0) {
                res0.setEncoding('utf8');
                res0.on('data', function (chunk) {
                    client[key].token = (JSON.parse(chunk)).accessToken;
                    console.log("accessToken:" + client[key].token);
                    log.trace('获取到accessToken');

                    if (client[key].token == null) {
                        console.log("获取到的accessToken无效");
                        log.trace('获取到的accessToken无效');
                        return;
                    }

                    //尝试连接第三方服务器
                    var host = 'http://101.231.215.60:15790'
                    const io = require('socket.io-client');
                    socket[key] = io.connect(host, {
                        query: 'token=' + client[key].token
                        , transports: ['websocket'], reconnection: false, reconnectionDelay: 5000

                    });

                    console.log('尝试连接' + host);
                    log.trace('尝试连接' + host);

                    //第三方服务器连接成功
                    socket[key].on('connect', function () {
                        console.log('connect success!');
                        log.trace('连接成功!');

                        SendData(params, res, key);
                    });
                    socket[key].on('disconnect', () => {
                        console.log('连接断开');
                        log.trace('连接断开!');
                    });
                    socket[key].on('connect_error', (error) => {
                        console.log(error);
                        log.trace('连接远程服务器失败!');
                    });

                });
            });
            tokenreq.on('error', function (e) {
                client[key].token = '';
                //尝试获取token失败
                console.log('problem with token request: ' + e.message);
                log.error('problem with token request: ' + e.message);
            });
            // write data to request body  
            var post_data = {};
            post_data.companyCode = client[key].cc;
            post_data.username = client[key].un;
            post_data.password = client[key].pw;

            var contenti = qs.stringify(post_data);

            tokenreq.write(contenti);
            tokenreq.end();
        }
        else {
            SendData(params, res, key);

            /*
            
                req.on('error', function (e) {  
                    console.log('problem with request: ' + e.message);  
                    log.trace('problem with request: ' + e.message);
            
                    //console.log('请求token失败'+data);
                    res.setHeader("content-type","text/html;charset=UTF-8")
                    res.end("{\"success\":false,\"errorCode\":\"TOKEN_ERROR_RELAYSERVER\",\"errorMessage\":\"\"}")
                });  
                
            */
            /*
            socket.on('connect_timeout', (timeout) =>  {
              console.log('connect_timeout'); 
            });
          */
        }
    } else {
        let datas = "";
        req.on("data", (chunk) => {
            datas += chunk;
            console.log(datas)

        })
        req.on("end", () => {
            //如果是ajax post请求这里换成JSON.parse
            let postData = queryString.parse(datas.toString())
            console.log(postData)
        })
        res.setHeader("content-type", "text/html;charset=UTF-8")
        res.end("当前请求方式为post")
    }
})

var port = 10097;
server.listen(port, () => {
    log.trace('server is ready on port ' + port);
})