'use strict';

var DiagramRenderer = require('power-assert-renderer-diagram');
var inherits = require('util').inherits;
var some = require('core-js/library/fn/array/some');

/**
 * options.stringify [function]
 * options.maxDepth [number]
 * options.lineSeparator [string]
 * options.anonymous [string]
 * options.circular [string]
 * 
 * options.widthOf [function]
 * options.ambiguousEastAsianCharWidth [number]
 */
function SuccinctRenderer (config) {
    DiagramRenderer.call(this, config);
}
inherits(SuccinctRenderer, DiagramRenderer);

SuccinctRenderer.prototype.onData = function (esNode) {
    if (!esNode.isCaptured) {
        return;
    }
    if (withinMemberExpression(esNode)) {
        return;
    }
    this.dumpIfSupported(esNode);
};

SuccinctRenderer.prototype.dumpIfSupported = function (esNode) {
    switch(esNode.node.type) {
    case 'Identifier':
    case 'MemberExpression':
    case 'CallExpression':
        this.events.push({value: esNode.value, leftIndex: esNode.range[0]});
        break;
    }
};

function withinMemberExpression (esNode) {
    var ancestors = collectAncestors([], esNode.parent);
    return some(ancestors, function (eachNode) {
        return eachNode.node.type === 'MemberExpression';
    });
}

function collectAncestors (ary, esNode) {
    if (!esNode) {
        return ary;
    }
    ary.push(esNode);
    return collectAncestors(ary, esNode.parent);
}

module.exports = SuccinctRenderer;