/**
 * 配置端自动分段的纯规则（spec §3.2 / §3.2.1）。
 *
 * 本文件**零依赖**——不 import vue、不 import 服务，
 * 这样 scripts/test-article-auto-format.mjs 可以直接转译执行，不需要任何 shim。
 */

/** 单段最大词数；超过则「应用配置」硬守卫拦截（spec §3.2 阈值汇总）。 */
export const MAX_PARAGRAPH_WORDS = 300

/** 粘贴触发弹窗的词数下限，严格大于才提示（spec §3.2 step 1）。 */
export const PASTE_PROMPT_MIN_WORDS = 50

export function countWords(text: string): number {
  const trimmed = text.trim()
  return trimmed ? trimmed.split(/\s+/).length : 0
}

/** 与后端 split_paragraphs 同规则：`\n+` 切段 + 段内空白归一 + 丢空段，再以 `\n\n` 接。 */
export function normalizeParagraphs(text: string): string {
  return text
    .split(/\n+/)
    .map(chunk => chunk.trim().split(/\s+/).join(' '))
    .filter(chunk => chunk.length > 0)
    .join('\n\n')
}

/** 是否存在超过上限的段落。提示文案不点名段号，故只回布尔（spec §3.2 step 4）。 */
export function hasOverlongParagraph(text: string): boolean {
  return normalizeParagraphs(text)
    .split('\n\n')
    .some(paragraph => countWords(paragraph) > MAX_PARAGRAPH_WORDS)
}

/**
 * 空文本框粘贴长文时提示（spec §3.2 step 1）。条件就是 spec 写的两条，没有第三条：
 * 原内容 trim 后为空，且新内容超过 50 词。
 *
 * 不再看新内容里有没有 `\n\n`。带空行 ≠ 分得适合朗读——一篇三段、每段 400 词的文章
 * 完全带空行，而每段就是一个录音单位，正是本功能要拆的东西。
 * 老师从网页/Word 复制的正文几乎必然带空行，加那条守卫等于让主要入口永不触发。
 */
export function shouldPromptOnPaste(prev: string, next: string): boolean {
  return prev.trim() === '' && countWords(next) > PASTE_PROMPT_MIN_WORDS
}
