import { walk } from 'estree-walker';
import isReference from './isReference.js';
import flattenReference from './flattenReference.js';

export default function contextualise ( code, expression, contexts, indexes, helpers, isEventHandler ) {
	const usedContexts = [];

	walk( expression, {
		enter ( node, parent ) {
			if ( isReference( node, parent ) ) {
				const { name } = flattenReference( node );

				if ( parent && parent.type === 'CallExpression' && node === parent.callee ) {
					if ( helpers[ name ] ) code.insertRight( node.start, `template.helpers.` );
					return;
				}

				if ( name === 'event' && isEventHandler ) {
					return;
				}

				if ( contexts[ name ] ) {
					if ( !~usedContexts.indexOf( name ) ) usedContexts.push( name );
				} else if ( indexes[ name ] ) {
					const context = indexes[ name ];
					if ( !~usedContexts.indexOf( context ) ) usedContexts.push( context );
				} else {
					code.insertRight( node.start, `root.` );
					if ( !~usedContexts.indexOf( 'root' ) ) usedContexts.push( 'root' );
				}

				this.skip();
			}
		}
	});

	return usedContexts;
}