<!DOCTYPE html>
<html ng-app="githubViewer">

  <head>
    <script data-require="angular.js@*" data-semver="1.3.0-beta.5" src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
    <script data-require="lodash.js@*" data-semver="2.4.1" src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-controller="MainController">
    <p>{{message1}}</p>
    <p>{{message2}}</p>
    <p>{{message3|json}}</p>
    <br />
  </body>

</html>
// Code goes here
(function() {

  var app = angular.module("githubViewer", []);

  var MainController = function($scope) {

   var items=[
      {currency:"USD", trader:"TRAD1", type:"FRA"},
      {currency:"USD", trader:"TRAD1", type:"FX"},
      {currency:"GBP", trader:"TRAD2", type:"FRA"},
      {currency:"USD", trader:"TRAD1", type:"DL"},
      {currency:"GBP", trader:"TRAD1", type:"FRA"}
     ];
    //console.log(data);
    
    var groups = ["type","currency","trader"]; //_.keys(items[0]);
     $scope.message1 = groups;
    
    $scope.message2 = genJSON(items,groups);
    
    function genJSON(csvData, groups) {

      
      var genGroups = function (data, isLast) {
        return _.map(data, function(element, index) {
              if(!isLast)
                return { name : index, selected : false, children : element };
              else
                return { name : index };
            });
      };
    
    var nest = function (node, curIndex) {
        var isLastNode = false;
        if (curIndex === 0) {
          node.children = genGroups(_.groupBy(csvData, groups[0]), isLastNode);
          _.each(node.children, function (child) {
            nest(child, curIndex + 1);
          });
        }
        else {
          if (curIndex == groups.length-1) isLastNode = true;
            
          if (curIndex < groups.length) {
              node.children = genGroups(
              _.groupBy(node.children, groups[curIndex]), isLastNode);
              
            _.each(node.children, function (child) {
              nest(child, curIndex + 1);
            });
          }
        }
        return node;
      };
      
      //var table = {};
      return nest({}, 0).children;
      //return node2.children;
  }

  };

  app.controller("MainController", MainController);

}());
/* Styles go here */