// 一键采纳改法：把审稿提议的补丁（original→replacement）应用到终稿。
// 纯逻辑（可单测，不依赖 DOM）。粒度=最小句段；找不到原文则不动正文（作者手改）。

export type FixOutcome =
  | { status: "applied"; text: string } // 命中原文并替换：text=改后终稿
  | { status: "not-found"; text: string } // 有补丁但终稿里找不到原文（作者已改稿/漂移）：text 原样
  | { status: "no-patch"; text: string }; // 该冲突无可自动应用的补丁：text 原样

// 是否带可应用补丁：original 非空 + replacement 为字符串（容许空串=删除）。
export function hasApplicableFix(
  original: string | null | undefined,
  replacement: string | null | undefined,
): boolean {
  return (
    typeof original === "string" &&
    original.length > 0 &&
    typeof replacement === "string"
  );
}

// 把首个匹配的 original 替换为 replacement（不可变：返回新串，不改入参）。
// 无补丁 → no-patch；有补丁但未命中 → not-found（终稿不变）；命中 → applied。
export function applyConflictFix(
  text: string,
  original: string | null | undefined,
  replacement: string | null | undefined,
): FixOutcome {
  if (!hasApplicableFix(original, replacement)) {
    return { status: "no-patch", text };
  }
  // hasApplicableFix 已收窄为 string。
  const from = original as string;
  const to = replacement as string;
  const idx = text.indexOf(from);
  if (idx === -1) {
    return { status: "not-found", text };
  }
  return {
    status: "applied",
    text: text.slice(0, idx) + to + text.slice(idx + from.length),
  };
}
