// 文风漂移段的「内容锚」定位（QA H3 / #9）：用漂移段携带的原文 `text` 在终稿里做
// 内容匹配定位回炉目标，而不是用位置索引 idx——因为审稿端的分段方式与前端按空行切段
// 不一定一致，靠 idx 取段会命中错段、越界则静默落空。纯逻辑，便于 node 环境单测。

import type { StyleDriftSegment } from "@/lib/review/sse";

// 在终稿里定位漂移段原文：
// 1) 段自带 text 且能在终稿里逐字搜到 → 返回该原文（最可靠，内容锚）。
// 2) text 为空/搜不到（旧数据、或作者已手改导致原文不在）→ 回退到位置 idx 取段；
//    idx 越界或取到空段 → 返回 null（由调用方就 #9 给出「无法定位」提示，不静默 no-op）。
export function locateDriftSegment(
  finalParas: readonly string[],
  segment: Pick<StyleDriftSegment, "idx" | "text">,
): string | null {
  const anchor = segment.text.trim();
  if (anchor.length > 0) {
    // 内容匹配：原文需在某一段里出现（终稿整体含该原文即视为可定位）。
    const found = finalParas.some((p) => p.includes(anchor));
    if (found) return anchor;
    // 自带原文但终稿里搜不到（已被手改）→ 不回退到可能错位的 idx，直接判定为定位失败。
    return null;
  }
  // 无内容锚（旧数据）→ 退回位置 idx 取段（兼容旧留痕）。
  const para = finalParas[segment.idx]?.trim() ?? "";
  return para.length > 0 ? para : null;
}
