'use strict';
const getDocumentationUrl = require('./utils/get-documentation-url');

const doesNotContain = (string, characters) => characters.every(character => !string.includes(character));

const isSimpleString = string => doesNotContain(
	string,
	['^', '$', '+', '[', '{', '(', '\\', '.', '?', '*']
);

const create = context => {
	return {
		CallExpression(node) {
			const {callee} = node;
			const {property} = callee;

			if (!(property && callee.type === 'MemberExpression')) {
				return;
			}

			const arguments_ = node.arguments;

			let regex;
			if (property.name === 'test' && callee.object.regex) {
				({regex} = callee.object);
			} else if (property.name === 'match' && arguments_ && arguments_[0] && arguments_[0].regex) {
				({regex} = arguments_[0]);
			} else {
				return;
			}

			if (regex.flags && regex.flags.includes('i')) {
				return;
			}

			const {pattern} = regex;
			if (pattern.startsWith('^') && isSimpleString(pattern.slice(1))) {
				context.report({
					node,
					message: 'Prefer `String#startsWith()` over a regex with `^`.'
				});
			} else if (pattern.endsWith('$') && isSimpleString(pattern.slice(0, -1))) {
				context.report({
					node,
					message: 'Prefer `String#endsWith()` over a regex with `$`.'
				});
			}
		}
	};
};

module.exports = {
	create,
	meta: {
		type: 'suggestion',
		docs: {
			url: getDocumentationUrl(__filename)
		}
	}
};
