// Amira Abdel-Rahman
// (c) Massachusetts Institute of Technology 2020

var gridSize=10;
var occupancy=[];

function createTruss(truss){ //todo move to geometry library
    
    var setupEmpty={//empty
        nodes: [
            ],
        edges: [
            ],
    
        //material properties - AISI 1095 Carbon Steel (Spring Steel)
        ndofs   : 3*6,
    
        animation :  {
        
            showDisplacement : true,
            exaggeration : 20e2,
            speed:3.0
            
        },
        viz :  {
            minStress:10e6,
            maxStress: -10e6,
            colorMaps:[coolwarm,YlGnBu, winter ,jet],
            colorMap:0,
            
        },
        
    };
    // console.log(setupEmpty)
    var setup=JSON.parse(JSON.stringify(setupEmpty));

    var material={
        area:2.38*2.38/5,
        density:0.028,
        stiffness:4000
    };
    var force=new THREE.Vector3(0,0,0);
    var restrained=false;
    var fixed=[true,true,true,true,true,true];
    var free=[false,false,false,true,true,true];
    var rollerX=[true,false,false,true,true,true];
    var rollerY=[false,true,false,true,true,true];
    var rollerZ=[false,false,true,true,true,true];

    for(var i=0;i<truss.nnx;i++){
        for(var j=0;j<truss.nny;j++){
            for(var k=0;k<truss.nnz;k++){
                

                // //3d inverter & gripper
                // if((i==(truss.nny-1)/2&& j==0&&k==(truss.nny-1)/2) ){
                //     force=new THREE.Vector3(0,10,0);
                // }else{
                //     force=new THREE.Vector3(0,0,0);
                // }

                //3d gripper
                if(j==(truss.nny-1)){
                    if((i==(truss.nny-1)/2&&k==0) ){
                        force=new THREE.Vector3(0,-10,0);
                    }else if((i==0&&k==(truss.nny-1)/2) ){
                        force=new THREE.Vector3(0,-10,0);
                    }else if((i==(truss.nny-1)/2&&k==(truss.nny-1)) ){
                        force=new THREE.Vector3(0,-10,0);
                    }else if((i==(truss.nny-1)&&k==(truss.nny-1)/2) ){
                        force=new THREE.Vector3(0,-10,0);
                    }else{
                        force=new THREE.Vector3(0,0,0);
                    }

                }else{
                    force=new THREE.Vector3(0,0,0);
                }



                addNode(setup,new THREE.Vector3(i*truss.dx,j*truss.dy,k*truss.dz),restrained,force,material);

                //3d 
                if(j==(0)){
                    if((i==(truss.nny-1)/2&&k==0) ){
                        setup.nodes[setup.nodes.length-1].restrained_degrees_of_freedom=fixed;
                    }else if((i==0&&k==(truss.nny-1)/2) ){
                        setup.nodes[setup.nodes.length-1].restrained_degrees_of_freedom=fixed;
                    }else if((i==(truss.nny-1)/2&&k==(truss.nny-1)) ){
                        setup.nodes[setup.nodes.length-1].restrained_degrees_of_freedom=fixed;
                    }else if((i==(truss.nny-1)&k==(truss.nny-1)/2) ){
                        setup.nodes[setup.nodes.length-1].restrained_degrees_of_freedom=fixed;
                    }else{
                        setup.nodes[setup.nodes.length-1].restrained_degrees_of_freedom=free;
                    }
                }else{
                    setup.nodes[setup.nodes.length-1].restrained_degrees_of_freedom=free;
                }

            

                // //3d gripper
                // if(j==(truss.nny-1)){
                //     if((i==(truss.nny-1)/2&&k==0) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(0,0,-1);
                //     }else if((i==0&&k==(truss.nny-1)/2) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(-1,0,0);
                //     }else if((i==(truss.nny-1)/2&&k==(truss.nny-1)) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(0,0,1);
                //     }else if((i==(truss.nny-1)&&k==(truss.nny-1)/2) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,0);
                //     }

                // }

                //auxetic/compliant
                // if(j==(truss.nny-1)/2.0){
                //     if((i==0&&k==0) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(-1,0,-1);
                //     }else if((i==0&&k==(truss.nny-1)) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(-1,0,1);
                //     }else if((i==(truss.nny-1)&&k==(truss.nny-1)) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,1);
                //     }else if((i==(truss.nny-1)&&k==0) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,-1);
                //     }

                // }

                // //twist
                // if(j==(truss.nny-1)/2.0){
                //     if((i==0&&k==0) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,0);
                //     }else if((i==0&&k==(truss.nny-1)) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(0,0,-1);
                //     }else if((i==(truss.nny-1)&&k==(truss.nny-1)) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(-1,0,0);
                //     }else if((i==(truss.nny-1)&&k==0) ){
                //         setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(0,0,1);
                //     }

                // }
                //shear
                if(j==(truss.nny-1)/2.0){
                    if((i==0&&k==0) ){
                        setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,0);
                    }else if((i==0&&k==(truss.nny-1)) ){
                        setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,0);
                    }else if((i==(truss.nny-1)&&k==(truss.nny-1)) ){
                        setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,0);
                    }else if((i==(truss.nny-1)&&k==0) ){
                        setup.nodes[setup.nodes.length-1].fixedDisplacement=new THREE.Vector3(1,0,0);
                    }

                }
                

            }
        }
    }

    if(truss.localConnections){
        for(var i=0;i<truss.nnx*truss.nny*truss.nnz;i++){
            var x=parseInt(setup.nodes[i].position.x/truss.dx);
            var y=parseInt(setup.nodes[i].position.y/truss.dy);
            var z=parseInt(setup.nodes[i].position.z/truss.dz);
            
            if(y!=truss.nny-1){
                var x1=x;
                var y1=y+1;
                var z1=z;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }
            if(x!=truss.nnx-1){
                var x1=x+1;
                var y1=y;
                var z1=z;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }
            if(x!=truss.nnx-1 &&y!=truss.nny-1 ){
                var x1=x+1;
                var y1=y+1;
                var z1=z;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }
            if(x!=truss.nnx-1 && y>0){
                var x1=x+1;
                var y1=y-1;
                var z1=z;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1){
                var x1=x;
                var y1=y;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&y!=truss.nny-1){
                var x1=x;
                var y1=y+1;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&x!=truss.nnx-1){
                var x1=x+1;
                var y1=y;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&y>0){
                var x1=x;
                var y1=y-1;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&x>0){
                var x1=x-1;
                var y1=y;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&y!=truss.nny-1&&x!=truss.nnx-1){
                var x1=x+1;
                var y1=y+1;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&y>0&&x>0){
                var x1=x-1;
                var y1=y-1;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&y>0&&x!=truss.nnx-1){
                var x1=x+1;
                var y1=y-1;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }

            if(z!=truss.nnz-1&&y!=truss.nny-1&&x>0){
                var x1=x-1;
                var y1=y+1;
                var z1=z+1;
                addEdge(setup,x*truss.nnz*truss.nny+y*truss.nnz+z,(x1)*truss.nnz*truss.nny+(y1)*truss.nnz+z1,material);
            }



            
   
        }

        

    }else{
        for(var i=0;i<truss.nnx*truss.nny*truss.nnz-1;i++){
            for(var j=0;j<truss.nnx*truss.nny*truss.nnz;j++){
                if(i!=j){
                    addEdge(setup,i,j,material);
                }

                
            }
        }
    }
    




    
    setup.hierarchical=false;

    // var data = {
    //     key: 'value'
    // };
    truss.setup=setup;
    
    

    
    var materials=[];
    var supports=[];
    var loads=[];
    var fixedDisplacements=[];
    // setup.materials=json.materials;
    // setup.supports=json.supports;
    // setup.loads=json.loads;
    // setup.fixedDisplacements=json.fixedDisplacements;

    // var materials1=json.materials;
    // var supports1=json.supports;
    // var loads1=json.loads;
    // var fixedDisplacements1=json.fixedDisplacements;
    // supports=[
    //     [

    //     ]
    // ];
    // var materials1=[];
    // var supports1=[];
    // var loads1=[];
    // var fixedDisplacements1=[];

    // for (var i=1;i<materials1.length;i++ ){
    //     var material1=materials1[i];
    //     var boundingMaterial=new _rhino3dm.BoundingBox(
    //         [
    //             material1[0].min.x,
    //             material1[0].min.y,
    //             material1[0].min.z
    //         ], 
    //         [
    //             material1[0].max.x,
    //             material1[0].max.y,
    //             material1[0].max.z
    //     ]);
    //     materials.push([ boundingMaterial,material1[1]]);
    // }

    // for (var i=0;i<supports1.length;i++ ){
    //     var support1=supports1[i];
    //     var boundingSupport=new _rhino3dm.BoundingBox(
    //         [
    //             support1[0].min.x,
    //             support1[0].min.y,
    //             support1[0].min.z
    //         ], 
    //         [
    //             support1[0].max.x,
    //             support1[0].max.y,
    //             support1[0].max.z
    //     ]);
    //     supports.push([ boundingSupport,support1[1]]);


    // }

    // for (var i=0;i<loads1.length;i++ ){
    //     var load1=loads1[i];
    //     var boundingLoad=new _rhino3dm.BoundingBox(
    //         [
    //             load1[0].min.x,
    //             load1[0].min.y,
    //             load1[0].min.z
    //         ], 
    //         [
    //             load1[0].max.x,
    //             load1[0].max.y,
    //             load1[0].max.z
    //     ]);
    //     loads.push([ boundingLoad,load1[1]]);
    // }

    // for (var i=0;i<fixedDisplacements1.length;i++ ){
    //     var fixedDisplacement1=fixedDisplacements1[i];
    //     var boundingFixedDisplacement=new _rhino3dm.BoundingBox(
    //         [
    //             fixedDisplacement1[0].min.x,
    //             fixedDisplacement1[0].min.y,
    //             fixedDisplacement1[0].min.z
    //         ], 
    //         [
    //             fixedDisplacement1[0].max.x,
    //             fixedDisplacement1[0].max.y,
    //             fixedDisplacement1[0].max.z
    //     ]);
    //     fixedDisplacements.push([ boundingFixedDisplacement,fixedDisplacement1[1]]);
    // }


    // changeMaterialFromBox(setup,materials);
    // restrainFromBox(setup,supports);
    // loadFromBox(setup,loads);
    // displacementFromBox(setup,fixedDisplacements);
    
    

    // // setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet];
    // setup.viz.minStress=10e6;
    // setup.viz.maxStress=-10e6;

    // setup.viz.exaggeration=1.0;
    // setup.animation.exaggeration=1.0;
    // setup.viz.colorMaps=[];

    // setup.numTimeSteps=json.numTimeSteps;
    // setup.maxNumFiles=json.maxNumFiles;


    // setup.poisson=json.poisson;
    // setup.scale=json.scale;
    // setup.linear=json.linear;
    // setup.globalDamping=json.globalDamping;
    // setup.thermal=json.thermal;
    

    // saveJSON();
    // console.log(setup)
    return setup;

    

    console.log("Success!")
    

}