import { tokenizer, tokTypes, parseExpressionAt } from 'acorn';

export function readEventHandlerDirective ( parser, start, name ) {
	const quoteMark = (
		parser.eat( `'` ) ? `'` :
		parser.eat( `"` ) ? `"` :
		null
	);

	const expressionStart = parser.index;
	let end = null;

	let depth = 0;
	for ( const token of tokenizer( parser.remaining() ) ) {
		if ( token.type === tokTypes.parenL ) depth += 1;
		if ( token.type === tokTypes.parenR ) {
			depth -= 1;
			if ( depth === 0 ) {
				end = expressionStart + token.end;
				break;
			}
		}
	}

	const expression = parseExpressionAt( parser.template.slice( 0, end ), expressionStart );
	parser.index = expression.end;

	if ( expression.type !== 'CallExpression' ) {
		parser.error( `Expected call expression`, expressionStart );
	}

	if ( quoteMark ) {
		parser.eat( quoteMark, true );
	}

	return {
		start,
		end: parser.index,
		type: 'EventHandler',
		name,
		expression
	};
}

export function readBindingDirective ( parser, start, name ) {
	const quoteMark = (
		parser.eat( `'` ) ? `'` :
		parser.eat( `"` ) ? `"` :
		null
	);

	const value = parser.read( /([a-zA-Z_$][a-zA-Z0-9_$]*)(\.[a-zA-Z_$][a-zA-Z0-9_$]*)*/ );
	if ( !value ) parser.error( `Expected valid property name` );

	if ( quoteMark ) {
		parser.eat( quoteMark, true );
	}

	return {
		start,
		end: parser.index,
		type: 'Binding',
		name,
		value
	};
}