/**
 * 安全的剪贴板复制工具
 * 提供跨浏览器的剪贴板复制功能，包含回退方案
 */

/**
 * 复制文本到剪贴板
 * 优先使用 Clipboard API，失败时静默回退到传统方法
 * 
 * @param text 要复制的文本
 * @returns Promise<boolean> 是否成功复制
 */
export async function copyToClipboard(text: string): Promise<boolean> {
  // 方法 1: 尝试使用现代 Clipboard API（仅在安全上下文中）
  if (navigator.clipboard && window.isSecureContext) {
    try {
      await navigator.clipboard.writeText(text);
      return true;
    } catch (err) {
      // 静默失败，继续尝试回退方法
      // 不输出警告，因为这是正常的回退行为
    }
  }

  // 方法 2: 使用 execCommand 回退方案（兼容性更好）
  return fallbackCopyToClipboard(text);
}

/**
 * 回退的剪贴板复制方法
 * 使用 document.execCommand('copy')
 * 
 * @param text 要复制的文本
 * @returns boolean 是否成功复制
 */
function fallbackCopyToClipboard(text: string): boolean {
  let textArea: HTMLTextAreaElement | null = null;
  
  try {
    // 创建临时文本区域
    textArea = document.createElement('textarea');
    textArea.value = text;
    
    // 设置样式使其不可见且不影响布局
    textArea.style.position = 'fixed';
    textArea.style.top = '0';
    textArea.style.left = '0';
    textArea.style.width = '2em';
    textArea.style.height = '2em';
    textArea.style.padding = '0';
    textArea.style.border = 'none';
    textArea.style.outline = 'none';
    textArea.style.boxShadow = 'none';
    textArea.style.background = 'transparent';
    textArea.style.opacity = '0';
    textArea.setAttribute('readonly', '');
    textArea.style.pointerEvents = 'none';
    
    document.body.appendChild(textArea);
    
    // 选择文本
    textArea.focus();
    textArea.select();
    
    // 兼容 iOS
    if (navigator.userAgent.match(/ipad|iphone/i)) {
      const range = document.createRange();
      range.selectNodeContents(textArea);
      const selection = window.getSelection();
      if (selection) {
        selection.removeAllRanges();
        selection.addRange(range);
      }
      textArea.setSelectionRange(0, 999999);
    }
    
    // 执行复制命令
    const successful = document.execCommand('copy');
    
    // 清理
    document.body.removeChild(textArea);
    
    return successful;
  } catch (err) {
    // 确保清理 DOM
    if (textArea && textArea.parentNode) {
      textArea.parentNode.removeChild(textArea);
    }
    // 只在真正失败时输出错误
    console.error('Clipboard copy failed:', err);
    return false;
  }
}

/**
 * 安全的剪贴板复制（同步版本）
 * 用于不支持 async/await 的场景
 * 直接使用回退方法
 * 
 * @param text 要复制的文本
 * @returns boolean 是否成功复制
 */
export function copyToClipboardSync(text: string): boolean {
  return fallbackCopyToClipboard(text);
}
