module.exports = function(RED) {
    "use strict";
    var HID = require('node-hid');
    var device;
    var node;

    function DigiRGBNode(n) {
        RED.nodes.createNode(this,n);
        node=this;

        var devices = HID.devices(0x16c0,0x05df);
        for (var i=0; i< devices.length; i++) {
            if (devices[i].product == 'DigiUSB') {
                node.log("found: " + devices[i].path);
                try {
                    device = new HID.HID(devices[i].path);
                    break;
                }
                catch (e) {
                    node.log(e)
                }
            }
        }

        var p1 = /^\#[A-Fa-f0-9]{6}$/
        var p2 = /[0-9]+,[0-9]+,[0-9]+/

        if (device) {
            this.on("input", function(msg) {
                if (p1.test(msg.payload)) {
                    var r = parseInt(msg.payload.slice(1,3),16);
                    var g = parseInt(msg.payload.slice(3,5),16);
                    var b = parseInt(msg.payload.slice(5),16);
                    device.sendFeatureReport([115,r,g,b]);
                }
                else if (p2.test(msg.payload)) {
                    var args = msg.payload.split(',');
                    if (args.length == 3) {
                        device.sendFeatureReport([115,parseInt(args[0]),parseInt(args[1]),parseInt(args[2])]);
                    }
                }
                else {
                    node.warn("incompatable input - " + msg.payload);
                }
            });
        }
        else {
            node.warn("no digispark RGB found");
        }

        this.on('close', function() {
            if (device) { device.close(); }
        });
    }
    RED.nodes.registerType("digiRGB",DigiRGBNode);
}