define(["virtual-dom"], function (V) {
  return function (headings, sortIndex, renderRow) {
    var data;
    var sortReverse = false;
    var el = document.createElement("table");
    var elLast = V.h("table");

    function sortTable(i) {
      sortReverse = i === sortIndex ? !sortReverse : false;
      sortIndex = i;

      updateView();
    }

    function sortTableHandler(i) {
      return function () {
        sortTable(i);
      };
    }

    function updateView() {
      var children = [];

      if (data.length !== 0) {
        var th = headings.map(function (d, i) {
          var properties = {
            onclick: sortTableHandler(i),
            className: "sort-header"
          };

          if (sortIndex === i) {
            properties.className += sortReverse ? " sort-up" : " sort-down";
          }

          return V.h("th", properties, d.name);
        });

        var links = data.slice(0).sort(headings[sortIndex].sort);

        if (headings[sortIndex].reverse ? !sortReverse : sortReverse) {
          links = links.reverse();
        }

        children.push(V.h("thead", V.h("tr", th)));
        children.push(V.h("tbody", links.map(renderRow)));
      }

      var elNew = V.h("table", children);
      el = V.patch(el, V.diff(elLast, elNew));
      elLast = elNew;
    }

    this.setData = function (d) {
      data = d;
      updateView();
    };

    this.el = el;

    return this;
  };
});