var express = require('express'),
        app = express(),
        server = require('http').createServer(app),
        io = require('socket.io').listen(server);
var flash = require('connect-flash');
var moment = require('moment');
var SnmpMac = require("./snmp-mac");
var IpPoll = require("./ip-poll");
var Flukso = require("./flukso");
var routes = require("./routes");
var path = require('path');

var spaceanswer = {
    api: "0.13",
    space: "Chaostreff Dortmund",
    logo: "http://www.chaostreff-dortmund.de/logo/logo_ctdo.svg",
    icon: {
        open: "http://status.ctdo.de/img/green.png",
        closed: "http://status.ctdo.de/img/red.png"
    },
    url: "http://www.chaostreff-dortmund.de/",
    location: {
        address: "Braunschweiger Str 22, 44145 Dortmund, Germany",
        lon: 7.4649449,
        lat: 51.527611
    },
    contact: {
        phone: "+49 231 8 404 777",
        irc: "irc://irc.hackint.eu/#ctdo",
        ml: "ccc@chaostreff-dortmund.de",
        twitter: "@ctdo",
        issue_mail: "server-admin@chaostreff-dortmund.de"
    },
    issue_report_channels: ["issue_mail"],
    state: {
        open: null,
        lastchange: 0,
        icon: {
            open: "http://status.ctdo.de/img/green.png",
            closed: "http://status.ctdo.de/img/red.png"
        }
    },
    sensors: {
        power_consumption: [{
                unit: "W",
                name: "mains power",
                description: "overall power consumption from our space",
                location: "basement",
                value: 0}]
    }
};
var simpleanswer = {state: "unknown", count: 0, names: [], lastchange: 0, power: 0};
var usercountanswer = {at: 0, current_value: 0, datapoints: [
        {at: 0, value: 0}
    ]};

var snmpMac = new SnmpMac("juni.ctdo.de", "ctdo23");
var ippoll = new IpPoll("switch2.raum.ctdo.de", "195.160.169.30-120");
var flukso = new Flukso("flukso.raum.ctdo.de", "/sensor/cf00e0b22230f4a8870af58f2b8719dd");

var port = '3000';
var address = 'localhost';

snmpMac.on('done', function (res) {
    simpleanswer.names = res;
    simpleanswer.lastchange = new Date().getTime();
});

ippoll.on('doneCount', function (num) {
    simpleanswer.count = num;
    simpleanswer.lastchange = new Date().getTime();
    ippoll.pollState();
});

ippoll.on('doneState', function (state) {
    spaceanswer.state.open = state;
    spaceanswer.state.lastchange = new Date().getTime();
    simpleanswer.state = state;
    simpleanswer.lastchange = spaceanswer.state.lastchange;
    io.sockets.emit('sdata', {data: simpleanswer});
});

flukso.on('done', function (num) {
    simpleanswer.power = num;
    spaceanswer.sensors.power_consumption[0].value = num;
    io.sockets.emit('sdata', {data: simpleanswer});
});

io.configure(function () {
    io.set('log level', 0);
});

function work() {
    snmpMac.poll();
    ippoll.pollCount();
}

setInterval(work, 60000);
work();

setInterval(flukso.pollPower, 5000);
flukso.pollPower();

app.set('snmpMac', snmpMac); //TODO: wie kann man das schoener machen? (Modul in die Routes reintun)
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.disable('x-powered-by');
app.configure('development', function () {
    app.use(express.errorHandler());
    app.locals.pretty = true;
});

app.use(express.static(__dirname + '/public'));
app.use(express.bodyParser());
app.use(express.cookieParser('chaostreff'));
app.use(express.session({cookie: {maxAge: 60000}}));
app.use(flash());
app.enable('trust proxy');

app.get('/api/spaceapi/v13', function (req, res) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Cache-Control", "no-cache");
    res.send(spaceanswer);
});
app.get('/api/simple/v2', function (req, res) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Cache-Control", "no-cache");
    res.send(simpleanswer);
});
app.get('/api/usercount', function (req, res) {
    ippoll.getHistory("-inf", "+inf", function (data) {
        usercountanswer.datapoints.length = 0;
        usercountanswer.at = simpleanswer.lastchange;
        usercountanswer.current_value = simpleanswer.count;
        usercountanswer.datapoints = data;
        res.send(usercountanswer);
    });
});
app.get('/api/simple/image', function (req, res) {
    if (spaceanswer.state.open == true) {
        res.sendfile(path.resolve(__dirname, 'public/img/green.png'));
    } else if (spaceanswer.state.open == false) {
        res.sendfile(path.resolve(__dirname, 'public/img/red.png'));
    } else {
        res.sendfile(path.resolve(__dirname, 'public/img/yellow.png'));
    }
});

app.get('/db', routes.db);
app.post('/form', routes.form);
app.get('/', routes.index);

//server.listen(3000, 'localhost');
var server = server.listen(port, address, function(err) {
   if(err){
    console.log(err);
   }

   var message = 'Server is running @ http://' + address + ':' + port;
   console.log(message);
});
