/* eslint-disable @typescript-eslint/no-explicit-any */

// based on https://github.com/sindresorhus/copy-text-to-clipboard, but improved to copy text styles too
export default (input: string): boolean => {
  const el = document.createElement('div');

  el.innerHTML = input;

  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  (el.style as any).contain = 'strict';
  el.style.position = 'absolute';
  el.style.left = '-9999px';
  el.style.fontSize = '12pt'; // Prevent zooming on iOS

  document.body.appendChild(el);

  const currentSelection = document.getSelection();
  if (!currentSelection) return true;

  let originalRange = null;
  if (currentSelection.rangeCount > 0) {
    originalRange = currentSelection.getRangeAt(0);
  }

  let range, selection;

  if ((document.body as any).createTextRange) {
    range = (document.body as any).createTextRange();
    range.moveToElement(el);
    range.select();
  } else if (window.getSelection) {
    selection = window.getSelection();

    range = document.createRange();
    range.selectNodeContents(el);

    selection.removeAllRanges();
    selection.addRange(range);
  }

  document.execCommand('copy');

  let success = false;
  try {
    success = document.execCommand('copy');
  } catch (err) {}

  if (!(document.body as any).createTextRange && window.getSelection) {
    window.getSelection().removeAllRanges();
  }

  document.body.removeChild(el);

  if (originalRange) {
    (selection as any).removeAllRanges();
    (selection as any).addRange(originalRange);
  }

  return success;
};
