function addMention(buffer, matches, state) {
  let username = matches[1] || matches[2];
  let { getURL, mentionLookup, formatUsername } = state.md.options.discourse;

  let type = mentionLookup && mentionLookup(username);

  let tag = 'a';
  let className = 'mention';
  let href = null;

  if (type === 'user') {
    href = getURL('/u/') + username.toLowerCase();
  } else if (type === 'group') {
    href = getURL('/groups/') + username;
    className = 'mention-group';
  } else {
    tag = 'span';
  }

  let token = new state.Token('mention_open', tag, 1);
  token.attrs = [['class', className]];
  if (href) {
    token.attrs.push(['href', href]);
  }

  buffer.push(token);
  if (formatUsername) {
    username = formatUsername(username);
  }

  token = new state.Token('text', '', 0);
  token.content = '@'+username;

  buffer.push(token);

  token = new state.Token('mention_close', tag, -1);
  buffer.push(token);
}

export function setup(helper) {
  helper.registerOptions((opts, siteSettings) => {
    opts.features.mentions = !!siteSettings.enable_mentions;
  });

  helper.registerPlugin(md => {

    const rule = {
      matcher: /@(\w[\w.-]{0,58}\w)|@(\w)/,
      onMatch: addMention
    };

    md.core.textPostProcess.ruler.push('mentions', rule);
  });
}