// based on https://github.com/sindresorhus/copy-text-to-clipboard, but improved to copy text styles too
export function copy(input: string): boolean {
  const element = document.createElement('textarea') as HTMLTextAreaElement;
  const previouslyFocusedElement = document.activeElement as HTMLElement;

  element.value = input;

  // Prevent keyboard from showing on mobile
  element.setAttribute('readonly', '');

  Object.assign(element.style, {
    contain: 'strict',
    position: 'absolute',
    left: '-9999px',
    fontSize: '12pt', // Prevent zooming on iOS
  });

  const selection = document.getSelection();
  let originalRange: boolean | Range = false;

  if (selection && selection.rangeCount > 0) {
    originalRange = selection.getRangeAt(0);
  }

  document.body.append(element);
  element.select();

  // Explicit selection workaround for iOS
  element.selectionStart = 0;
  element.selectionEnd = input.length;

  let isSuccess = false;
  try {
    isSuccess = document.execCommand('copy');
  } catch (_) {}

  element.remove();

  if (selection && originalRange) {
    selection.removeAllRanges();
    selection.addRange(originalRange);
  }

  // Get the focus back on the previously focused element, if any
  if (previouslyFocusedElement) {
    previouslyFocusedElement.focus();
  }

  return isSuccess;
}
