'use strict';

var defaultOptions = require('./default-options');
var assign = require('core-js/library/fn/object/assign');
var BabelEspowerVisitor = require('./babel-espower-visitor');

module.exports = function createEspowerVisitor (babel, options) {
    return {
        visitor: {
            Program: function (path, state) {
                var opts = assign(defaultOptions(), {
                    astWhiteList: babel.types.BUILDER_KEYS,
                    visitorKeys: babel.types.VISITOR_KEYS,
                    sourceRoot: process.cwd()
                }, options, state.opts);
                var espowerVisitor = new BabelEspowerVisitor(babel, opts);
                var innerVisitor = Object.keys(opts.visitorKeys).reduce(function (handlers, nodeType) {
                    handlers[nodeType] = {
                        enter: function (nodePath, pluginPass) {
                            espowerVisitor.enter(nodePath);
                        },
                        exit: function (nodePath, pluginPass) {
                            espowerVisitor.exit(nodePath);
                        }
                    };
                    return handlers;
                }, {});
                path.traverse(innerVisitor, state);
            }
        }
    };
};