/**
 * 去掉 HTML 标签，用于列表摘要展示。
 * 保留实体简单还原，避免简介全是标签噪音。
 */
export function stripHtml(html?: string | null): string {
  if (!html) return ''
  return String(html)
    .replace(/<[^>]+>/g, ' ')
    .replace(/&nbsp;/gi, ' ')
    .replace(/&amp;/gi, '&')
    .replace(/&lt;/gi, '<')
    .replace(/&gt;/gi, '>')
    .replace(/\s+/g, ' ')
    .trim()
}

/**
 * 外链打开：H5 新开；小程序复制到剪贴板（无 web-view 页时的折中）。
 */
export function openExternalUrl(url?: string) {
  const u = String(url || '').trim()
  if (!u) return
  // #ifdef H5
  window.open(u, '_blank')
  // #endif
  // #ifndef H5
  uni.setClipboardData({
    data: u,
    success: () => uni.showToast({ title: '链接已复制', icon: 'none' }),
  })
  // #endif
}

/** 解析作品 links（可能是 JSON 字符串） */
export function parseWorkLinks(links: unknown): { live?: string, demo?: string, github?: string } {
  if (!links) return {}
  if (typeof links === 'string') {
    try {
      return JSON.parse(links) as { live?: string, demo?: string, github?: string }
    }
    catch {
      return {}
    }
  }
  if (typeof links === 'object') return links as { live?: string, demo?: string, github?: string }
  return {}
}

/** 展平技术栈分组为标签列表 */
export function flattenTechStack(stack?: { category?: string, items?: string[], [k: string]: unknown }[]): string[] {
  if (!Array.isArray(stack)) return []
  const out: string[] = []
  stack.forEach((g) => {
    const items = Array.isArray(g.items) ? g.items : []
    items.forEach((i) => {
      if (i) out.push(String(i))
    })
    // 兼容 { category, item } 扁平行
    if (!items.length && g.item) out.push(String(g.item))
  })
  return out
}
