export type ClipboardCopyMethod = 'clipboard-api' | 'exec-command';

/**
 * 将文本写入系统剪贴板，并在现代 Clipboard API 不可用时降级处理。
 *
 * @param text 要复制的文本。
 * @returns 实际使用的复制方式。
 * @throws 当浏览器环境不可用或所有复制方式均失败时抛出异常。
 */
export async function copyTextToClipboard(
  text: string,
): Promise<ClipboardCopyMethod> {
  if (typeof document === 'undefined' || typeof navigator === 'undefined') {
    throw new TypeError('当前环境不支持剪贴板操作');
  }

  if (globalThis.isSecureContext && navigator.clipboard?.writeText) {
    try {
      await navigator.clipboard.writeText(text);
      return 'clipboard-api';
    } catch {
      // 权限或浏览器策略拒绝时继续使用兼容方案。
    }
  }

  const textArea = document.createElement('textarea');
  const activeElement = document.activeElement;
  textArea.value = text;
  textArea.readOnly = true;
  textArea.setAttribute('aria-hidden', 'true');
  textArea.style.position = 'fixed';
  textArea.style.top = '0';
  textArea.style.left = '-9999px';
  textArea.style.opacity = '0';

  try {
    document.body.append(textArea);
    textArea.focus({ preventScroll: true });
    textArea.select();
    textArea.setSelectionRange(0, textArea.value.length);

    if (!document.execCommand('copy')) {
      throw new Error('浏览器拒绝了复制操作');
    }
    return 'exec-command';
  } finally {
    textArea.remove();
    if (activeElement instanceof HTMLElement) {
      activeElement.focus({ preventScroll: true });
    }
  }
}
