var express = require("express");
var hbs = require('express-hbs');
require('handlebars-form-helpers').register(hbs.handlebars);
//var nodemailer = require('nodemailer');
var courtsopenUtils = require('./courtsopenUtils.js');
var fs = require("fs");
var bodyParser = require("body-parser");
var app = express();
var logfile = fs.createWriteStream('./db/log.log', {flags: 'a'});

// Setup email
//var transporter = nodemailer.createTransport({
    //service: 'Gmail',
    //auth: {
        //user: 'alertmonitorfl@gmail.com',
        //pass: '6g*hkvVc%91oo3#$'
    //}
//});
//var mailOptions = {
    //from: 'Alert Monitor <alertmonitorfl@gmail.com>',
    //to: 'jody@kaplon.us,don@gettner.com',
    //subject: 'Alert received',
    //text: 'test alert'  // Get custom text later on email generation.
//};


var file = "./db/courtsopen.db";
var exists = fs.existsSync(file);

if(!exists) {
    console.log("Creating DB file.");
    fs.openSync(file, "w");
}

var sqlite3 = require("sqlite3").verbose();
var db = new sqlite3.Database(file);

db.serialize(function() {
    if(!exists) {
        // Can't create multiple tables w/one statement, semicolons not allowed.
        db.run(
            "CREATE TABLE Alerts (" +
                "origJSON TEXT," +
                "coreId TEXT," +
                "status TEXT," +
                "published_at TEXT)"
        );
        db.run(
            "CREATE TABLE Cores (" +
                "coreId TEXT PRIMARY KEY," +
                "coreName TEXT," +
                "locationDesc TEXT)"
        );
    }
});

app.use(bodyParser.json());                             // Needed for JSON POST requests from Particle Cores.
app.use(bodyParser.urlencoded({ extended: false }));    // Needed for web POST requests from edit form.

// Use `.hbs` for extensions and find partials in `views/partials`.
app.engine('hbs', hbs.express4({
    partialsDir: __dirname + '/views/partials'
}));
app.set('view engine', 'hbs');
app.set('views', __dirname + '/views');

app.get('/', function(req, res){
    var d = new Date();
    console.log("GET /, " + JSON.stringify(d, 4));
    var devIndexQry = 
        "select status, published_at " + 
        "from Alerts " + 
        "where status in ('Open', 'Closed') " +
        "order by published_at desc " +
        "limit 2"
    db.all(devIndexQry, function(err, rows){
        if(err !== null) {
            console.log(err);
        } else {
            //console.log(rows);

            // Loop over elements in rows array, convert ugly UTC times to pretty local times.
            rows.forEach(function(row){
                row.pubDate = courtsopenUtils.getLocDateFromUTC(row.published_at);
                row.pubTime = courtsopenUtils.getLocTimeFromUTC(row.published_at);
                if(row.status.toLowerCase().indexOf('closed') > -1){
                    row.statusClass = 'closed';
                } else { row.statusClass = 'open'; }
            });

            res.render('index', {values: rows}, function(err, html) {
                if(err !== null) {
                    console.log(err);
                } else {
                    res.send(html);
                }
            });
        }
    });
});

app.post('/', function(req, res){
    var postEvent = req.body.postEvent;
    var source = req.body.source;
    console.log(req.body);

    var innerDataJSON = JSON.parse(req.body.data);
    var status = JSON.stringify(innerDataJSON.status, null, 4).slice(1,-1);
    var coreid = JSON.stringify(req.body.coreid, null, 4).slice(1,-1);
    var pubAt = JSON.stringify(req.body.published_at, null, 4).slice(1,-1);
    var stmt = db.prepare("INSERT INTO Alerts (OrigJSON, coreid, published_at, status) VALUES (?, ?, ?, ?)");
    stmt.run(
        JSON.stringify(req.body, null, 4),
        coreid,
        pubAt,
        status
    );
    stmt.finalize();

    // Send emails on alerts only
    //if(status.toLowerCase().indexOf('alert') > -1){
        //mailOptions.text = 'An alert message was received: \n\n';
        //mailOptions.text = mailOptions.text + 'Status message, ' + status + '\n';
        //mailOptions.text = mailOptions.text + 'Published at, ' + courtsopenUtils.getLocDateFromUTC(pubAt) + ' ' + courtsopenUtils.getLocTimeFromUTC(pubAt) + '\n';
        //mailOptions.text = mailOptions.text + 'From device, ' + courtsopenUtils.getCoreNameFromCoreId(db, coreid) + '\n';
        //var nameQry = 'SELECT coreName FROM Cores WHERE coreId = ?;'
        //db.get(nameQry, coreid, function(err, row){
            //if ((err) || (typeof row == undefined)) {
                // Don't care about this error or empty result set, still need to send email.
                //row.coreName = '# No Name #';
            //}
            //mailOptions.text = mailOptions.text + 'From device, ' + row.coreName + '\n';

            //transporter.sendMail(mailOptions, function(error, info){
                //if(error){
                    //console.log(error);
                //}else{
                    //console.log('Message sent: ' + info.response);
                //}
            //});
        //});
    //}
    //res.send(JSON.stringify(req.body, null, 4));
});

app.listen(3000, function() {
    console.log("Started on PORT 3000");
})