var settings = require('ep_etherpad-lite/node/utils/Settings');
var eejs = require('ep_etherpad-lite/node/eejs');
var db = require('ep_etherpad-lite/node/db/DB').db;
var padManager = require('ep_etherpad-lite/node/db/PadManager');
var async = require('ep_etherpad-lite/node_modules/async');


exports.handleMessage = function(hook_name, context, cb) {
    var isOptInPublicMessage = false;
    if (context && context.message && context.message.type === 'COLLABROOM') {
        if (context.message.data && context.message.data.type && context.message.data.type === 'opt-in_public') {
            isOptInPublicMessage = true;
        }
    }

    if (! isOptInPublicMessage) {
        cb(false);
        return false;
    }

    var msg   = context.message.data;
    var padId = msg.padId;

    db.get("opt-in_index:" + padId + ":done", function(err, val) {
        if (err) {
            console.log("opt-in_index: error: " + err);
            return false;
        }
        if (val === true) {
            console.log("opt-in_index: setting publicity flag for pad " + padId + " was done already");
            // done already -> cb(null) drops message
            cb(null);
            return false;
        } else {
            db.get("opt-in_index:" + padId + ":padPublishKey", function(err, key) {
                if (err) {
                    console.log("opt-in_index: error: " + err);
                    return false;
                }
                if (msg.action === "setOptInPublicFlag" && msg.message.key === key) {
                    console.log("everything ok, setting pad " + padId + " public to " + msg.message.public);
                    db.set("opt-in_index:" + padId, msg.message.public);
                    db.set("opt-in_index:" + padId + ":done", true);
                }
            });
        }
    });
};



exports.expressConfigure = function (hook_name, ctx, cb) {
    ctx.app.get('/list', function(req, res) {
        var render_args = {
            pads: []
        };

        async.waterfall([
            function(cb) {
                padManager.listAllPads(cb);
            },
            function(pads, cb) {
                async.each(pads.padIDs, function(padId, errCb) {
                    db.get("opt-in_index:" + padId, function(err, pub) {
                        if (err) {
                            errCb(err);
                            return;
                        }
                        if (pub) {
                            render_args.pads.push(padId);
                        }
                        errCb(null);
                    });
                }, function(err) {
                    cb(err);
                });
            },
            function(cb) {
                render_args.pads = render_args.pads.sort(function (a, b) {
                        return a.toLowerCase().localeCompare(b.toLowerCase());
                });
                res.send(eejs.require('ep_opt-in_index/templates/pads.html', render_args));
                cb();
            }
        ]);
    });
};