/**
 * Created by aghassaei on 1/7/15.
 */

require.config({

    baseUrl: 'js',

    paths: {
        jquery: '../dependencies/jquery-2.1.3',
        underscore: '../dependencies/underscore',
        backbone: '../dependencies/backbone',
        flatUI: '../dependencies/flatUI/js/flat-ui',
        bootstrapSlider: '../dependencies/bootstrap-slider/bootstrap-slider',
        fileSaverLib: '../dependencies/loaders/FileSaver.min',
        numeric: '../dependencies/numeric-1.2.6',
        codeMirrorJS: '../dependencies/codemirror/javascript',
        codeMirror: '../dependencies/codemirror/codemirror',
        text: '../dependencies/require/text',
        bin: '../dependencies/require/bin',

        //three
        three: '../dependencies/three',
        orbitControls: '../dependencies/OrbitControls',
        stlLoader: '../dependencies/loaders/STLLoader',
        stlExport: '../dependencies/loaders/binary_stl_writer',
        threeModel: 'three/ThreeModel',
        threeView: 'three/ThreeView',
        fillGeometry: 'three/FillGeometry',
        axes: 'three/Axes',
        svgRenderer: '../dependencies/svgRenderer',
        threeProjector: '../dependencies/Projector',

        //plist
        plist: 'plists/PList',

        //models
        globals: 'models/Globals',
        appState: 'models/AppState',
        fileSaver: 'models/FileSaver',
        dnaExport: 'dnaExport/dnaExport',

        //communication
        socketio: '../dependencies/socket.io-1.3.5',
        serialComm: 'models/SerialComm',
        commPlist: 'plists/CommPlist',
        machineState: 'models/MachineState',

        //lattice classes and extra methods
        latticeBase: 'lattice/LatticeBase',
        lattice: 'lattice/Lattice',
        compositeEditorLattice: 'lattice/CompositeEditorLattice',
        latticeImportGeo: 'lattice/ImportGeo',
        latticeCAM: 'lattice/LatticeCAM',

        //lattice "subclasses"
        cubeLattice: 'lattice/latticeSubclasses/CubeLattice',
        gikLattice: 'lattice/latticeSubclasses/GIKLattice',
        kelvinLattice: 'lattice/latticeSubclasses/KelvinLattice',
        octaEdgeLattice: 'lattice/latticeSubclasses/OctaEdgeLattice',
        octaFaceLattice: 'lattice/latticeSubclasses/OctaFaceLattice',
        octaRotEdgeLattice: 'lattice/latticeSubclasses/OctaRotEdgeLattice',
        octaVertexLattice: 'lattice/latticeSubclasses/OctaVertexLattice',
        truncatedCubeLattice: 'lattice/latticeSubclasses/TruncatedCubeLattice',
        tetraStackedLattice: 'lattice/latticeSubclasses/TetraStackedLattice',
        tetraVertexLattice: 'lattice/latticeSubclasses/TetraVertexLattice',
        hexLattice: 'lattice/latticeSubclasses/HexagonalLattice',
        hexRotLattice: 'lattice/latticeSubclasses/HexagonalRotLattice',

        //baseplane
        baseplane: 'baseplane/BasePlane',
        squareBaseplane: 'baseplane/SquareBasePlane',
        octaBaseplane: 'baseplane/OctaBasePlane',
        rotEdgeOctaBaseplane: 'baseplane/RotEdgeOctaBasePlane',
        hexBaseplane: 'baseplane/HexagonalBasePlane',
        hexRotBasePlane: 'baseplane/HexagonalRotBasePlane',

        //highlighter
        highlighter: 'highlighter/Highlighter',
        defaultHighlighter: 'highlighter/DefaultHighlighter',
        cubeHighlighter: 'highlighter/CubeHighlighter',
        superCellHighlighter: 'highlighter/SuperCellHighlighter',
        octaFaceHighlighter: 'highlighter/OctaFaceHighlighter',
        truncatedCubeHighlighter: 'highlighter/TruncatedCubeHighlighter',

        //cells
        cell: 'cells/DMACell',
        octaFaceCell: 'cells/OctaFaceCell',
        octaEdgeCell: 'cells/OctaEdgeCell',
        octaVertexCell: 'cells/OctaVertexCell',
        octaRotEdgeCell: 'cells/OctaRotEdgeCell',
        tetraStackedCell: 'cells/TetraStackedCell',
        tetraVertexCell: 'cells/TetraVertexCell',
        truncatedCubeCell: 'cells/TruncatedCubeCell',
        kelvinCell: 'cells/KelvinCell',
        cubeCell: 'cells/CubeCell',
        gikCell: 'cells/GIKCell',
        superCell: 'cells/supercells/DMASuperCell',
        gikSuperCell: 'cells/supercells/GIKSuperCell',
        compositeCell: "cells/supercells/CompositeCell",
        hexCell: 'cells/HexagonalCell',
        hexRotCell: 'cells/HexagonalRotCell',
        dnaBrickCell: 'cells/DNABrickCell',

        //parts
        part: 'parts/DMAPart',
        octaFaceTriPart: 'parts/OctaFaceTriPart',
        octaEdgeVoxPart: 'parts/OctaEdgeVoxPart',
        octaEdgeVoxPartLowPoly: 'parts/OctaEdgeVoxPartLowPoly',
        gikPart: 'parts/GIKPart',
        gikPartLowPoly: 'parts/GIKPartLowPoly',
        kennyTeqPart: 'parts/KennyTeqPart',
        kennyTeqHighResPart: 'parts/KennyTeqHighResPart',
        samTeqPart: 'parts/SamTeqPart',
        legoPart: 'parts/LegoPart',
        dnaStraightPart: 'parts/DNAStraightPart',
        dnaLegoPart: 'parts/DNALegoPart',

        //materials
        materialsPlist: 'plists/MaterialsPlist',
        materials: 'materials/DMAMaterials',
        material: 'materials/DMAMaterial',
        compositeMaterial: 'materials/DMACompositeMaterial',

        //UI
        navbar: 'menus/Navbar',
        navViewMenu: 'menus/NavViewMenu',//view dropdown
        ribbon: 'menus/Ribbon',
        modalView: 'menus/ModalView',
        menuWrapper: 'menus/MenuWrapperView',
        menuParent: 'menus/MenuParentView',
        latticeMenu: 'menus/LatticeMenuView',
        importMenu: 'menus/ImportMenuView',
        partMenu: 'menus/PartMenuView',
        scriptMenu: 'menus/ScriptMenuView',
        materialMenu: 'menus/MaterialMenuView',
        materialPropertiesMenu: 'menus/MaterialPropertiesMenuView',
        optimizeMenu: 'menus/OptimizationMenuView',
        assemblerMenu: 'menus/AssemblerMenuView',
        camMenu: 'menus/CamMenuView',
        editCamOutputMenu: 'menus/EditCamOutputMenuView',
        animateMenu: 'menus/AnimationMenuView',
        sendMenu: 'menus/SendMenuView',
        compositeMenu: 'menus/CompositeMenuView',
        materialEditorMenu: 'menus/MaterialEditorMenuView',
        setupCommMenu: 'menus/SetupCommMenuView',
        discoveryMenu: 'menus/DiscoveryMenuView',
        eSetupMenu: 'menus/ESetupMenuView',
        eStaticMenu: 'menus/EStaticMenuView',
        eDynamicMenu: 'menus/EDynamicMenuView',
        mSetupMenu: 'menus/MSetupMenuView',
        mStaticMenu: 'menus/MStaticMenuView',
        mDynamicMenu: 'menus/MDynamicMenuView',
        dnaSetupMenu: 'menus/DNASimSetupMenuView',
        dnaExportMenu: 'menus/DNAExportMenuView',
        assemblerSetupMenu: 'menus/AssemblerSetupMenuView',
        editComponentMenu: 'menus/EditComponentMenuView',
        commParentMenu: 'menus/CommParentMenu',
        serialMonitorController: 'SerialMonitor/SerialMonitorController',

        //templates
        navViewMenuTemplate: 'menus/templates/NavViewMenu.html',
        ribbonTemplate: 'menus/templates/Ribbon.html',
        modalViewTemplate: 'menus/templates/ModalView.html',
        scriptView: 'menus/ScriptView',
        menuWrapperTemplate: 'menus/templates/MenuWrapperView.html',
        latticeMenuTemplate: 'menus/templates/LatticeMenuView.html',
        importMenuTemplate: 'menus/templates/ImportMenuView.html',
        partMenuTemplate: 'menus/templates/PartMenuView.html',
        scriptMenuTemplate: 'menus/templates/ScriptMenuView.html',
        materialMenuTemplate: 'menus/templates/MaterialMenuView.html',
        optimizeMenuTemplate: 'menus/templates/OptimizationMenuView.html',
        assemblerMenuTemplate: 'menus/templates/AssemblerMenuView.html',
        camMenuTemplate: 'menus/templates/CamMenuView.html',
        editCamOutputMenuTemplate: 'menus/templates/EditCamOutputMenuView.html',
        animationMenuTemplate: 'menus/templates/AnimationMenuView.html',
        sendMenuTemplate: 'menus/templates/SendMenuView.html',
        compositeMenuTemplate: 'menus/templates/CompositeMenuView.html',
        materialEditorMenuTemplate: 'menus/templates/MaterialEditorMenuView.html',
        setupCommMenuTemplate: 'menus/templates/SetupCommMenuView.html',
        discoveryMenuTemplate: 'menus/templates/DiscoveryMenuView.html',
        eSetupMenuTemplate: 'menus/templates/ESetupMenuView.html',
        eStaticMenuTemplate: 'menus/templates/EStaticMenuView.html',
        eDynamicMenuTemplate: 'menus/templates/EDynamicMenuView.html',
        mSetupMenuTemplate: 'menus/templates/MSetupMenuView.html',
        mStaticMenuTemplate: 'menus/templates/MStaticMenuView.html',
        mDynamicMenuTemplate: 'menus/templates/MDynamicMenuView.html',
        assemblerSetupMenuTemplate: 'menus/templates/AssemblerSetupMenuView.html',
        editComponentMenuTemplate: 'menus/templates/EditComponentMenuView.html',

        //electronic sim
        eSimPlist: 'plists/ESimPlist',
        eSim: 'simulation/electronics/eSim',
        latticeESim: 'simulation/electronics/LatticeEsim',
        eSimCell: 'simulation/electronics/cells/eSimCell',
        eSimSuperCell: 'simulation/electronics/cells/eSimSuperCell',
        eSimField: 'simulation/electronics/eSimField',


        //cam
        cam: 'cam/Cam',
        camPlist: 'plists/CamPList',

        //assemblers
        assembler: 'cam/assemblers/Assembler',
        assemblerPost: 'cam/assemblers/AssemblerPost',
        component: 'cam/assemblers/Component',
        stockComponent: 'cam/assemblers/StockComponent',
        urdfJoint: 'cam/assemblers/URDFJoint',
        urdfLink: 'cam/assemblers/URDfLink',

        //processes
        gcode: 'cam/processes/GCodeExporter',
        shopbot: 'cam/processes/ShopbotExporter',
        tinyG: 'cam/processes/TinyGExporter',

        //stls (not sure why ../ is not working here?)
        octaFaceTrianglePartSTL: 'assets/stls/parts/OctaFaceTrianglePart.stl',
        octaEdgeVoxPartSTL: 'assets/stls/parts/OctaEdgeVoxPart.stl',
        octaEdgeVoxPartLowPolySTL: 'assets/stls/parts/OctaEdgeVoxPartLowPoly.stl',
        gikPartSTL: 'assets/stls/parts/GIKPart.stl',
        gikEndPartSTL: 'assets/stls/parts/GIKEndPart.stl',
        gikPartLowPolySTL: 'assets/stls/parts/GIKPartLowPoly.stl',
        gikEndPartLowPolySTL: 'assets/stls/parts/GIKEndPartLowPoly.stl',
        kennyTeqPartSTL: 'assets/stls/parts/KennyTeqPart.stl',
        kennyTeqPartHighResSTL: 'assets/stls/parts/KennyTeqPartHighRes.stl',
        samTeqPartSTL: 'assets/stls/parts/SamTeqPart.stl',
        legoBrickSTL: 'assets/stls/parts/legoBrick1x1.stl',
        dnaLegoBrickSTL: 'assets/stls/parts/DNALegoBrick1x2.stl',
        dnaLegoBrick1x1STL: 'assets/stls/parts/DNALegoBrick1x1.stl'

    },

    shim: {
        three: {
            exports: 'THREE'
        },
        orbitControls: {
            deps: ['three'],
            exports: 'THREE'
        },
        stlLoader: {
            deps: ['three'],
            exports: 'THREE'
        },
        stlExport: {
            exports: 'geometryToSTLBin'
        },
        threeProjector: {
            deps: ['three'],
            exports: "THREE"
        },
        svgRenderer: {
            deps: ['three', 'threeProjector'],
            exports: "THREE.SVGRenderer"
        },
        fileSaverLib: {
            exports: 'saveAs'
        },
        flatUI: {
            deps: ['jquery']
        },
        bootstrapSlider:{
            deps: ['jquery'],
            exports: '$'
        },
        'socketio': {
            exports: 'io'
        },
        'numeric': {
            exports: 'numeric'
        }
    }

});

//require.onError = function (err) {
//    console.log(err.requireType);
//    console.log(err.requireModules);
//    throw err;
//};

//init stuff
require(['appState', 'lattice', 'navbar', 'threeModel', 'threeView', 'globals', 'flatUI', 'bootstrapSlider', 'ribbon', 'menuWrapper', 'scriptView'],
    function(appState, lattice, Navbar, three, ThreeView, globals){

    new Navbar({model:appState});

    var threeView = new ThreeView({model:three});
    globals.threeView = threeView;//todo fix this

//    three.startAnimationLoop();

//    if (lattice.get("connectionType") != "gik") lattice.getUItarget().addCellAtIndex({x:0,y:0,z:0});//add a cell
});