'use strict';

angular.module('dgc.lineage').controller('LineageController', ['$element', '$scope', '$stateParams', 'LineageResource', 'd3',
    function($element, $scope, $stateParams, LineageResource, d3) {

        function render(nodes) {
            var links = d3.layout.tree().links(nodes);
            // Restart the force layout.
            force.nodes(nodes)
                .links(links)
                .start();

            // Update links.
            link = link.data(links, function(d) {
                return d.target.__id;
            });

            link.exit().remove();

            link.enter().insert('line', '.node')
                .attr('class', 'link');

            // Update nodes.
            node = node.data(nodes, function(d) {
                return d.__id;
            });

            node.exit().remove();

            var nodeEnter = node.enter().append('g')
                .attr('class', 'node')
                //.on('click', click)
                .call(force.drag);

            nodeEnter.append('circle')
                .attr('class', function(d) {
                    return d.children ? '' : 'empty';
                }).attr('r', 9);

            nodeEnter.append('text')
                .attr('dy', '2em')
                .text(function(d) {
                    //return d.name;
                    return d.__name || d.__key;
                });

            /*node.select('circle')
             .style('fill', color);*/
        }

        function tick() {
            link.attr('x1', function(d) {
                return d.source.x;
            }).attr('y1', function(d) {
                return d.source.y;
            }).attr('x2', function(d) {
                return d.target.x;
            }).attr('y2', function(d) {
                return d.target.y;
            });

            node.attr('transform', function(d) {
                return 'translate(' + d.x + ',' + d.y + ')';
            });
        }

        var width = Math.max($element[0].offsetWidth, 960),
            height = Math.max($element[0].offsetHeight, 350);

        var force = d3.layout.force()
            .linkDistance(200)
            .charge(-120)
            .gravity(0.05)
            .size([width, height])
            .on('tick', tick);

        var svg = d3.select($element[0]).select('svg')
            .attr('width', width)
            .attr('height', height);

        var link = svg.selectAll('.link'),
            node = svg.selectAll('.node');

        $scope.lineageData = LineageResource.get({
            id: $stateParams.id
        }, function(data) {
            var nodes = {};

            function getNode(nodeId) {
                if (!nodes[nodeId]) {
                    nodes[nodeId] = angular.copy(data.vertices[nodeId]);
                }
                return nodes[nodeId];
            }

            angular.forEach(data.edges, function(node) {
                /* Put the head (node) inside tail (node)
                 * Tail is parent
                 * Head is child
                 * */
                var parentId = node.tail,
                    parentNode = getNode(parentId);
                if (!parentNode.children) {
                    parentNode.children = [];
                }
                var childId = node.head;
                parentNode.children.push(getNode(childId));
            });

            var id = 0,
                returnArray = [];

            angular.forEach(nodes, function(node, key) {
                node.__id = id++;
                node.__key = key;
                node.__name = node['hive_table.name'];
                returnArray.push(node);
            });
            render(returnArray);
        });
    }
]);