#!/usr/bin/env node
'use strict';
var PORT = 9909;
var HOST = '172.18.12.2';
var LIGHTS = 36;
var dgram = require('dgram');
var Animation = require('animation').Animation;
var flatten = require('annofp').flatten;
var range = require('annomath').range;
main();
function main() {
    animate({
        nick: 'bebraw',
        sequence: wave({
            rgb: [255, 0, 0]
        }),
        /*fadeIn({
            min: 0,
            max: 255,
            step: 5
        }).concat(fadeOut({
            min: 0,
            max: 255,
            step: 5
        })),*/
        interval: '100ms',
        times: 5
    });
}
function wave(o) {
    return range(LIGHTS).map(function(v) {
        return [{
            id: v,
            rgb: o.rgb
        }];
    });
}
function wave2(o) {
    return range(LIGHTS).map(function(v) {
        var ret = setAll({rgb: [0, 0, 0]});
        ret[v].rgb = o.rgb;
        return ret;
    });
}
function fadeIn(o) {
    var min = o.min || 0;
    var max = o.max || 255;
    var step = o.step || 1;
    return range(min, max + 1, step).map(function(v) {
        return setAll({rgb: [v, v, v]});
    });
}
function fadeOut(o) {
    var min = o.min || 0;
    var max = o.max || 255;
    var step = o.step || 1;
    return range(min, max + 1, step).reverse().map(function(v) {
        return setAll({rgb: [v, v, v]});
    });
}
/*
demos
[
    setAll({rgb: [128, 128, 128]}),
    setAll({rgb: [128, 128, 128]})
]
[
    [{
        id: 10,
        rgb: [0, 0, 255]
    },
    {
        id: 13,
        rgb: [0, 0, 255]
    }],
    [{
        id: 10,
        rgb: [255, 0, 0]
    },
    {
        id: 13,
        rgb: [255, 0, 0]
    }]
]
 */
function setAll(o) {
    return range(LIGHTS).map(function(v) {
        return {
            id: v,
            rgb: o.rgb
        };
    });
}
function animate(o) {
    var animation = new Animation({
        frame: o.interval
    });
    var frames = o.sequence.map(function(frame) {
        return flatten(frame.map(function(v) {
            return [1, v.id, 0].concat(v.rgb);
        }));
    });
    var times = o.times || 1;
    var i = 0;
    var j = 0;
    animation.on('tick', function() {
        var frame;
        if(!frames[i]) {
            j++;
            if(j === times) {
                animation.stop();
            }
            i = 0;
        }
        frame = frames[i];
        sendMessage(o.nick, frame);
        i++;
    });
    animation.start();
}
function sendMessage(nick, light) {
    var message = [1, 0].concat(toOrdinals(nick)).concat([0]).concat(light);
    var client = dgram.createSocket('udp4');
    client.send(new Buffer(message), 0, message.length, PORT, HOST, function(err) {
        if(err) {
            return console.error(err);
        }
        client.close();
    });
}
function toOrdinals(str) {
    return str.split('').map(function(v) {
        return v.charCodeAt(0);
    });
}