import {MDCTooltip} from '@material/tooltip';

import {createImmuneLink} from '../../common/commonUtils.js';
import {escapeUsername} from '../../common/communityConsoleUtils.js';
import {isOptionEnabled} from '../../common/options/optionsUtils.js';
import {createPlainTooltip} from '../../common/tooltip.js';
import {createExtBadge} from '../communityConsole/utils/common.js';

var authuser = (new URL(location.href)).searchParams.get('authuser') || '0';

export function getSearchUrl(query) {
  var urlpart = encodeURIComponent('query=' + encodeURIComponent(query));
  var authuserpart =
      (authuser == '0' ? '' : '?authuser=' + encodeURIComponent(authuser));
  return 'https://support.google.com/s/community/search/' + urlpart +
      authuserpart;
}

export function injectPreviousPostsLinksUnifiedProfile(isCommunityConsole) {
  var nameElement =
      document.querySelector('.scTailwindUser_profileUsercardname');
  if (nameElement === null) {
    console.error('[previousposts] Can\'t find username.');
    return;
  }

  var name = escapeUsername(nameElement.textContent);
  var filter = '(creator:"' + name + '" | replier:"' + name + '") forum:any';
  var url = getSearchUrl(filter);

  var links = document.createElement('div');
  links.classList.add('TWPT-user-profile__user-links');

  var a = isCommunityConsole ? createImmuneLink() : document.createElement('a');
  a.classList.add('TWPT-user-profile__user-link', 'TWPT-user-link');
  a.href = url;
  a.target = '_parent';
  a.setAttribute(
      'data-stats-id', 'user-posts-link--tw-power-tools-by-avm99963');

  let badge, badgeTooltip;
  if (isCommunityConsole) {
    [badge, badgeTooltip] = createExtBadge();
  } else {
    badge = document.createElement('span');
    badge.classList.add('TWPT-badge');

    var badgeImg = document.createElement('img');
    badgeImg.src =
        'https://fonts.gstatic.com/s/i/materialicons/repeat/v6/24px.svg';

    badge.appendChild(badgeImg);
  }

  a.appendChild(badge);

  var span = document.createElement('span');
  span.textContent = chrome.i18n.getMessage('inject_previousposts');

  a.appendChild(span);
  links.appendChild(a);

  var userDetailsNode =
      document.querySelector('.scTailwindUser_profileUsercarddetails');
  if (userDetailsNode === null) {
    console.error('[previousposts] Can\'t get user card details div.');
    return;
  }

  userDetailsNode.parentNode.insertBefore(links, userDetailsNode.nextSibling);

  if (isCommunityConsole)
    new MDCTooltip(badgeTooltip);
  else
    createPlainTooltip(
        badge, chrome.i18n.getMessage('inject_extension_badge_helper', [
          chrome.i18n.getMessage('appName')
        ]));
}

export function injectPreviousPostsLinksUnifiedProfileIfEnabled(
    isCommunityConsole) {
  isOptionEnabled('history').then(isEnabled => {
    if (isEnabled) injectPreviousPostsLinksUnifiedProfile(isCommunityConsole);
  });
}
