/**
 * notion-enhancer: global block links
 * (c) 2021 admiraldus (https://github.com/admiraldus)
 * (c) 2021 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
 * (https://notion-enhancer.github.io/) under the MIT license
 */

export default async function ({ web, components, notion }, db) {
  const topbarShareSelector = '.notion-topbar-share-menu',
    blockActionSelector =
      '.notion-overlay-container .notion-scroller.vertical .notion-focusable > div > div > [style*="text-overflow: ellipsis;"]',
    hoveredActionSelector =
      '.notion-overlay-container .notion-scroller.vertical .notion-focusable[style*="background:"]',
    topbarCopyClass = 'global_block_links--topbar_copy',
    blockCopyClass = 'global_block_links--block_copy',
    hiddenClass = 'global_block_links--hidden';

  const topbarCopyIcon = await db.get(['topbar_copy_icon']),
    topbarCopyText = await db.get(['topbar_copy_text']);
  if (topbarCopyIcon || topbarCopyText) {
    const $topbarCopyTemplate = web.render(
      web.html`<div class="${topbarCopyClass}" role="button" tabindex="0"></div>`,
      topbarCopyIcon
        ? web.html`<svg viewBox="0 0 30 30">
            <path d="M2,12c0-3.309,2.691-6,6-6h8c3.309,0,6,2.691,6,6s-2.691,6-6,6h-6c0,0.736,
            0.223,1.41,0.574,2H16c4.418,0,8-3.582,8-8 c0-4.418-3.582-8-8-8H8c-4.418,0-8,3.582-8,
            8c0,2.98,1.634,5.575,4.051,6.951C4.021,18.638,4,18.321,4,18 c0-0.488,0.046-0.967,
            0.115-1.436C2.823,15.462,2,13.827,2,12z M25.953,11.051C25.984,11.363,26,11.68,26,12
            c0,0.489-0.047,0.965-0.117,1.434C27.176,14.536,28,16.172,28,18c0,3.309-2.691,6-6,6h-8c-3.309,
            0-6-2.691-6-6s2.691-6,6-6h6 c0-0.731-0.199-1.413-0.545-2H14c-4.418,0-8,3.582-8,8c0,
            4.418,3.582,8,8,8h8c4.418,0,8-3.582,8-8 C30,15.021,28.368,12.428,25.953,11.051z"></path>
          </svg>`
        : '',
      topbarCopyText
        ? web.html`
            <span data-copy>Copy link</span>
            <span data-copied class="${hiddenClass}">Link copied!</span>
          `
        : ''
    );

    const insertTopbarCopy = () => {
      const $btns = document.querySelectorAll(topbarShareSelector);
      $btns.forEach(($btn) => {
        if (!$btn.previousElementSibling?.classList?.contains?.(topbarCopyClass)) {
          const $copy = $topbarCopyTemplate.cloneNode(true);
          components.addTooltip($copy, '**Copy page link**');
          $btn.before($copy);

          let resetButtonDelay;
          $copy.addEventListener('click', () => {
            if (topbarCopyText) {
              const $copyText = $copy.querySelector('[data-copy]'),
                $copiedText = $copy.querySelector('[data-copied]');
              $copyText.classList.add(hiddenClass);
              $copiedText.classList.remove(hiddenClass);
              clearTimeout(resetButtonDelay);
              resetButtonDelay = setTimeout(() => {
                $copyText.classList.remove(hiddenClass);
                $copiedText.classList.add(hiddenClass);
              }, 1250);
            }

            web.copyToClipboard(`https://notion.so/${notion.getPageID().replace(/-/g, '')}`);
          });
        }
      });
    };
    insertTopbarCopy();
    web.addDocumentObserver(insertTopbarCopy, [topbarShareSelector]);
  }

  const $blockCopyTemplate = web.html`
    <div class="${blockCopyClass}" role="button" tabindex="0">
      ${await components.feather('globe')}
      <span>Global link</span>
    </div>`;

  const getLinkButtons = () =>
      [...document.querySelectorAll(blockActionSelector)]
        .filter(($action) =>
          ['Copy link', '링크 복사', 'リンクをコピー'].includes($action.textContent)
        )
        .map(($action) => $action.closest('.notion-focusable')),
    insertBlockCopy = () => {
      const $btns = getLinkButtons();
      $btns.forEach(($btn) => {
        if (!$btn.previousElementSibling?.classList?.contains?.(blockCopyClass)) {
          const $copy = $blockCopyTemplate.cloneNode(true);
          $btn.before($copy);

          $copy.addEventListener('mouseover', () => {
            document.querySelectorAll(hoveredActionSelector).forEach(($action) => {
              $action.style.background = '';
            });
          });

          $copy.addEventListener('click', async () => {
            $btn.click();
            const link = await web.readFromClipboard(),
              id = link.replace(/.+#(?=\w+)/, '');
            web.copyToClipboard(id.length === 32 ? `https://notion.so/${id}` : link);
          });
        }
      });
    };
  insertBlockCopy();
  web.addDocumentObserver(insertBlockCopy, [blockActionSelector]);
}