#!/usr/bin/env node
;(function() {
/**
 * Copyright 2014 IBM Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/
 
var util = require("util");
var request = require("request");
var colors = require('colors');
var apiRequest = require("./lib/request");
var config = require("./lib/config");

var commands = {
    "target": function() {
        var target = process.argv[3];
        if (target) {
            if (!/^https?:\/\/.+/.test(target)) {
                console.warn("Invalid target url");
                return;
            }
            if (target.slice(-1) == "/") {
                target = target.slice(0,target.length-1);
            }
            var oldTarget = config.target;
            config.target = target;
        } else {
            console.log("Target: ".yellow+config.target);
        }
        
    },
    "nodes": function() {
        apiRequest('/nodes',{}).then(logNodeList).otherwise(logFailure);
    },
    "node": function() {
        apiRequest('/nodes/'+process.argv[3],{}).then(logNodeList).otherwise(logFailure);
    },
    "enable-node": function() {
        apiRequest('/nodes/'+process.argv[3],{
            method: "PUT",
            body: JSON.stringify({enabled:true})
        }).then(logNodeList).otherwise(logFailure);
    },
    "disable-node": function() {
        apiRequest('/nodes/'+process.argv[3],{
            method: "PUT",
            body: JSON.stringify({enabled:false})
        }).then(logNodeList).otherwise(logFailure);
    },
    "install": function() {
        apiRequest('/nodes',{
            method: "POST",
            body: JSON.stringify({module:process.argv[3]})
        }).then(logNodeList).otherwise(logFailure);
    },
    "remove": function() {
        apiRequest('/nodes/'+process.argv[3],{
            method: "DELETE"
        }).then(logNodeList).otherwise(logFailure);
    },
    "search": function() {
        var options = {
            method: "GET",
            url: 'https://registry.npmjs.org/-/_view/byKeyword?startkey=["node-red"]&endkey=["node-red",{}]&group_level=3' ,
            headers: {
                'Accept': 'application/json',
            }
        };
        request(options, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                var info = (JSON.parse(body)).rows;
                var filter = null;
                if (process.argv[3]) {
                    filter = new RegExp(process.argv[3]);
                }
                for (var i=0;i<info.length;i++) {
                    var n = info[i];
                    if (!filter || filter.test(n.key[1]) || filter.test(n.key[2])) {
                        console.log(n.key[1] + (" - "+ n.key[2]).grey);
                    }
                }
            } else if (error) {
                console.log(error.toString().red);
            } else {
                console.log((response.statusCode+": "+body).red);
            }
        });   
    }
}

function logNodeList(nodes) {
    if (!util.isArray(nodes)) {
        nodes = [nodes];
    }
    for (var i=0;i<nodes.length;i++) {
        var n = nodes[i];
        console.log(formatNodeInfo(n))
    }
}

function logFailure(msg) {
    console.log(msg.red);
}

function formatBoolean(v,c) {
    if (v) {
        return ("["+c+"]");
    } else {
        return ("[ ]");
    }
}

function formatNodeInfo(n) {
    var inError = n.hasOwnProperty("err");
    
    var str = formatBoolean(n.enabled,"X")+formatBoolean(n.loaded,"L")+" ";
    str += n.id;
    if (n.enabled && n.loaded) {
        str = str.green;
    } else if (n.enabled && n.err) {
        str = str.red;
    } else {
        str = str.yellow;
    }
    if (n.module) {
        str += " ["+n.module+"]";
    }
    str += " "+n.types.join(", ");
    if (n.err) {
        str+=" "+n.err.red;
    }
    return str;
}

if (commands[process.argv[2]]) {
    commands[process.argv[2]].call();
}


})();