module.exports = function(RED) {
    "use strict";
    var hids = require('hidstream');

    function MakeyNode(n) {
        RED.nodes.createNode(this,n);
        this.vid = 0x1b4f;      // MakeyMakey vendor ID
        this.pid = 0x2b75;      // MakeyMakey product ID
        var node = this;
        var path = null;
        var tout;
        var click = false;
        var keylookup = { "44":"space", "82":"up", "81":"down", "79":"right", "80":"left",
                            "26":"w", "4":"a", "22":"s", "7":"d", "9":"f", "10":"g" };

        var findmakey = function() {
            node.log("looking for MakeyMakey");
            var devices = hids.getDevices();
            for (var dev = 0; dev < devices.length; dev++) {
                //node.log("Find:"+devices[dev].vendorId.toString(16)+":"+devices[dev].productId.toString(16));
                if ((devices[dev].vendorId == node.vid) && (devices[dev].productId == node.pid)) {
                    path = devices[dev].path;
                    node.log("found MakeyMakey at: "+path);     //path = "0003:0004:00";
                    break; // stop on first match
                }
            }
            if (path === null) {
                tout = setTimeout( function () {
                    findmakey();
                },15000);
            }
        }
        findmakey();

        if (path != null) {
            try {
                node.makey = new hids.device(path);
                node.makey.on("data", function(key) {
                    var msg = {payload:[]};
                    //console.log(key);
                    if (key.modKeys[0] === "shift") {
                        for (var keys = 0; keys < key.keyCodes.length; keys++) {
                            node.log(key.keyCodes[keys]+" : "+keylookup[key.keyCodes[keys].toString()]);
                            msg.payload.push(keylookup[key.keyCodes[keys].toString()]);
                        }
                        msg.payload = msg.payload.join();
                        node.send(msg);
                    }
                    else if (key.modKeys[0] === "ctrl") {
                        if (key.charCodes.length === 0) {
                            click = !click;
                            msg.payload = (click) ? "click" : "clock";
                            node.send(msg);
                        }
                    }
                    else { console.log(key); }
                });
            }
            catch(err) { node.warn("can't open MakeyMakey: Do you need root access ?"); }
        }
        else {
            findmakey();
        }

        this.on("close", function() {
            if (tout) { clearTimeout(tout); }
            if (node.makey) { node.makey.device.close(); }
        });
    }
    RED.nodes.registerType("makeymakey",MakeyNode);
}