/**
 * Serve plugins on the static server
 *
 * @copyright 2013, Ajax.org B.V.
 */

define(function(require, exports, module) {
    "use strict";
        
    main.consumes = ["Plugin", "connect.static"];
    main.provides = ["c9.static.plugins"];
    return main;


    function main(options, imports, register) {
        var Plugin = imports.Plugin;
        var statics = imports["connect.static"];
        var fs = require("fs");
        
        var whitelist = options.whitelist;
        var blacklist = options.blacklist;
        var externalPlugins = options.externalPlugins || [];
        
        /***** Initialization *****/
        
        var plugin = new Plugin("Ajax.org", main.consumes);
        
        var loaded = false;
        function load(){
            if (loaded) return false;
            loaded = true;
            
            var requirePaths = {
                ace: "lib/ace/lib/ace",
                ace_tree: "lib/ace_tree/lib/ace_tree",
                treehugger: "lib/treehugger/lib/treehugger",
                acorn: "lib/treehugger/lib/acorn",
                jsonm: "lib/jsonm",
                tern: "lib/tern",
                tern_from_ts: "lib/tern_from_ts",
                ui: "lib/ui",
                c9: "lib/c9",
                frontdoor: "lib/frontdoor",
                outplan: "lib/outplan/dist/outplan",
            };
            
            if (whitelist === "*") {
                statics.addStatics([{
                    path: __dirname + "/../../node_modules",
                    mount: "/lib"
                }]);
    
                statics.addStatics([{
                    path: __dirname + "/../../plugins",
                    mount: "/plugins",
                    rjs: requirePaths
                }]); 
            } else {
                [
                    "ace_tree", 
                    "acorn",
                    "tern",
                    "tern_from_ts",
                    "treehugger",
                    "jsonm",
                    "pivottable",
                    "architect",
                    "source-map",
                    "rusha",
                    "c9",
                    "ui",
                    "emmet",
                    "frontdoor",
                    "outplan",
                    "mocha", // TESTING
                    "chai",  // TESTING
                ].forEach(function(name) {
                    statics.addStatics([{
                        path: __dirname + "/../../node_modules/" + name,
                        mount: "/lib/" + name
                    }]);
                });
                
                statics.addStatics([{
                    path: __dirname + "/../../node_modules/ace",
                    mount: "/lib/ace",
                    rjs: requirePaths
                }]);

                statics.addStatics(externalPlugins.map(function(plugin) {
                    if (typeof plugin == "string")
                        plugin = { path: plugin, mount: plugin};
                    return {
                        path: __dirname + "/../../node_modules/" + plugin.path,
                        mount: "/plugins/" + plugin.mount
                    };
                }));
                
                try {
                    statics.addStatics(
                        fs.readdirSync(__dirname + "/../../integrations/").map(function(plugin) {
                            if (/^scripts$|\.(json|sh)$/.test(plugin)) 
                                return;
                            return {
                                path: __dirname + "/../../integrations/" + plugin,
                                mount: "/plugins/" + plugin
                            };
                        }).filter(Boolean)
                    );
                } catch(e) {
                }
                
                statics.addStatics(fs.readdirSync(__dirname + "/../")
                    .filter(function(path) {
                        if (path in blacklist)
                            return false;
                        else if (path in whitelist)
                            return true;
                        else if (path.indexOf("c9.ide.") === 0)
                            return true;
                        else if (path.indexOf("c9.account") === 0)
                            return true;
                        else
                            return false;
                    })
                    .map(function(path) {
                       return {
                            path: __dirname + "/../../plugins/" + path,
                            mount: "/plugins/" + path
                        };
                    })
                );
            }
            
            statics.addStatics([{
                path: __dirname + "/www",
                mount: "/"
            }]);
            
            statics.addStatics([{
                path: __dirname + "/../../docs",
                mount: "/docs"
            }]);

        }
        
        /***** Lifecycle *****/
        
        plugin.on("load", function(){
            load();
        });
        plugin.on("unload", function(){
            loaded = false;
        });
        
        /***** Register and define API *****/
        
        plugin.freezePublicAPI({});
        
        register(null, {
            "c9.static.plugins": plugin
        });
    }
});
