/*global describe it before after  =*/

"use client";

require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai) {
    var expect = chai.expect;
    
    expect.setupArchitectTest([
        {
            packagePath : "plugins/c9.core/c9",
            workspaceId : "ubuntu/ip-10-35-77-180",
            startdate   : new Date(),
            debug       : true,
            hosted      : true,
            local       : false,
            davPrefix   : "/"
        },
        
        "plugins/c9.core/ext",
        "plugins/c9.core/http",
        "plugins/c9.core/util",
        "plugins/c9.ide.ui/lib_apf",
        "plugins/c9.ide.ui/menus",
        {
            packagePath: "plugins/c9.core/settings",
            testing: true
        },
        {
            packagePath  : "plugins/c9.ide.ui/ui",
            staticPrefix : "plugins/c9.ide.ui"
        },
        "plugins/c9.ide.editors/document",
        "plugins/c9.ide.editors/undomanager",
        {
            packagePath: "plugins/c9.ide.editors/editors",
            defaultEditor: "ace"
        },
        "plugins/c9.ide.editors/editor",
        "plugins/c9.ide.editors/tabmanager",
        "plugins/c9.ide.ui/focus",
        "plugins/c9.ide.editors/pane",
        "plugins/c9.ide.editors/tab",
        "plugins/c9.ide.ace/ace",
        {
            packagePath  : "plugins/c9.ide.ace.statusbar/statusbar",
            staticPrefix : "plugins/c9.ide.layout.classic"
        },
        "plugins/c9.ide.keys/commands",
        "plugins/c9.fs/proc",
        "plugins/c9.vfs.client/vfs_client",
        "plugins/c9.vfs.client/endpoint",
        "plugins/c9.ide.auth/auth",
        "plugins/c9.fs/fs",
        
        // Mock plugins
        {
            consumes : ["apf", "ui", "Plugin"],
            provides : [
                "commands", "menus", "layout", "watcher",
                "save", "preferences", "anims", "gotoline", "clipboard",
                "dialog.alert", "auth.bootstrap", "info", "ace.gotoline"
            ],
            setup    : expect.html.mocked
        },
        {
            consumes : ["tabManager", "ace"],
            provides : [],
            setup    : main
        }
    ], architect);
    
    function main(options, imports, register) {
        var tabs    = imports.tabManager;
        var ace     = imports.ace;
        
        function getTabHtml(tab){
            return tab.pane.aml.getPage("editor::" + tab.editorType).$ext
        }
        
        expect.html.setConstructor(function(tab){
            if (typeof tab == "object")
                return tab.$ext;
        });
        
        describe('statusbar', function() {
            before(function(done){
                apf.config.setProperty("allow-select", false);
                apf.config.setProperty("allow-blur", false);
                
                bar.$ext.style.background = "rgba(220, 220, 220, 0.93)";
                bar.$ext.style.position = "fixed";
                bar.$ext.style.left = "20px";
                bar.$ext.style.right = "20px";
                bar.$ext.style.bottom = "20px";
                bar.$ext.style.height = "33%";
      
                document.body.style.marginBottom = "33%";
                
                tabs.on("ready", function(){
                    tabs.getPanes()[0].focus();
                    done();
                })
            });
            
            describe("open", function(){
                this.timeout(10000);
                
                it('should open a pane with just an editor', function(done) {
                    tabs.openFile("/file.txt", function(err, tab){
                        expect(tabs.getTabs()).length(1);
                        
                        var sb  = tab.document.getSession().statusBar;
                        var bar = sb.getElement("bar");
                        expect.html(bar, "rowcol").text("1:1");
                        
                        tab.document.editor.ace.selectAll();
                        setTimeout(function(){
                            expect.html(bar, "rowcol sel").text("2:1");
                            expect.html(bar, "sel").text("23 Bytes");
                            
                            done();
                        }, 100);
                    });
                });
                it('should handle multiple documents in the same pane', function(done) {
                    tabs.openFile("/listing.json", function(err, tab){
                        expect(tabs.getTabs()).length(2);
                        
                        tab.activate();
                        
                        setTimeout(function(){
                            var sb = tab.document.getSession().statusBar;
                            expect.html(sb.getElement("bar"), "caption").text("1:1");
                            
                            done();
                        }, 100);
                    });
                });
            });
            describe("split(), pane.unload()", function(){
                it('should split a pane horizontally, making the existing pane the left one', function(done) {
                    var pane = tabs.focussedTab.pane;
                    var righttab = pane.hsplit(true);
                    tabs.focussedTab.attachTo(righttab);
                    
                    setTimeout(function(){
                        expect.html(pane.aml, "pane").text("2:1");
                        expect.html(righttab.aml, "righttab").text("1:1");
                    
                        done();
                    }, 100);
                });
//                it('should remove the left pane from a horizontal split', function(done) {
//                    var pane  = tabs.getPanes()[0];
//                    var tab = tabs.getPanes()[1].getTab();
//                    pane.unload();
//                    expect(tabs.getPanes()).length(1);
//                    expect(tabs.getTabs()).length(2);
//                    tabs.focusTab(tab);
//                    done();
//                });
            });
//            describe("Change Theme", function(){
//                this.timeout(10000);
//                
//                it('should change a theme', function(done) {
//                    var editor = tabs.focussedTab.editor;
//                    ace.on("themeInit", function setTheme(){
//                        ace.off("theme.init", setTheme);
//                        expect.html(getTabHtml(tabs.focussedTab).childNodes[1]).className("ace-monokai");
//                        editor.setOption("theme", "ace/theme/textmate");
//                        done();
//                    });
//                    editor.setOption("theme", "ace/theme/monokai");
//                });
//            });
            
            // @todo test split api and menu
            
           if (!onload.remain){
               after(function(done){
                   tabs.unload();
                   
                   document.body.style.marginBottom = "";
                   done();
               });
           }
        });
        
        onload && onload();
    }
});
@@ -752,32 +752,69 @@
 true%0A        %7D,%0A
+        %22plugins/c9.ide.api/api.js%22,%0A
         %7B%0A      

Fix the setting-dependant tests - add api dependency