import {escapeUsername} from '../common/communityConsoleUtils.js';

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

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;
}

function injectPreviousPostsLinksUnifiedProfile() {
  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 = 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');

  var badge = document.createElement('span');
  badge.classList.add('TWPT-badge');
  badge.setAttribute(
      'title', chrome.i18n.getMessage('inject_extension_badge_helper', [
        chrome.i18n.getMessage('appName')
      ]));

  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);
}

function injectPreviousPostsLinksOldProfile() {
  if (document.querySelector('.user-profile__user-links') === null) {
    var nameElement = document.querySelector('.user-profile__user-name');
    if (nameElement !== null) {
      var profileLink = document.querySelector('.community-console');
      if (profileLink === null) {
        console.error(
            '[previousposts] ' +
            'The user is not a PE so we can\'t show the previous posts link.');
        return;
      }

      var profileUrl = profileLink.href || '';
      var profileUrlSplit = profileUrl.split('/forum/');
      if (profileUrlSplit.length < 2) {
        console.error('[previousposts] Can\'t get forum id.');
        return;
      }

      var forumId = profileUrlSplit[1].split('/')[0];
      var name = escapeUsername(nameElement.textContent);
      var filter =
          '(creator:"' + name + '" | replier:"' + name + '") forum:' + forumId;
      var url = getSearchUrl(filter);

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

      var linkTitle = document.createElement('div');
      linkTitle.classList.add('user-profile__user-link-title');
      linkTitle.textContent = chrome.i18n.getMessage('inject_links');

      links.appendChild(linkTitle);

      var ul = document.createElement('ul');

      var li = document.createElement('li');
      li.classList.add('user-profile__user-link');

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

      var badge = document.createElement('span');
      badge.classList.add('TWPT-badge');
      badge.setAttribute(
          'title', chrome.i18n.getMessage('inject_extension_badge_helper', [
            chrome.i18n.getMessage('appName')
          ]));

      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);
      li.appendChild(a);
      ul.appendChild(li);
      links.appendChild(ul);

      document.querySelector('.user-profile__user-details-container')
          .appendChild(links);
    } else {
      console.error('[previousposts] Can\'t find username.');
    }
  }
}

chrome.storage.sync.get(null, function(items) {
  if (items.history) {
    if (document.getElementById('unified-user-profile') !== null)
      injectPreviousPostsLinksUnifiedProfile();
    else
      injectPreviousPostsLinksOldProfile();
  }
});
