/**
 * AGENTS.md 같은 사용자 소유 문서에 우리 블록만 안전하게 심고 빼기 위한 마커 처리.
 * 블록 밖의 내용은 절대 건드리지 않는다.
 */

export function startTag(marker: string): string {
  return `<!-- ${marker}:start -->`;
}
export function endTag(marker: string): string {
  return `<!-- ${marker}:end -->`;
}

export function hasBlock(doc: string, marker: string): boolean {
  return doc.includes(startTag(marker)) && doc.includes(endTag(marker));
}

/** 블록이 있으면 내용만 교체, 없으면 문서 끝에 덧붙인다 */
export function upsertBlock(doc: string, marker: string, content: string): string {
  const s = startTag(marker);
  const e = endTag(marker);
  const block = `${s}\n${content.trim()}\n${e}`;

  const si = doc.indexOf(s);
  const ei = doc.indexOf(e);
  if (si !== -1 && ei !== -1 && ei > si) {
    return doc.slice(0, si) + block + doc.slice(ei + e.length);
  }
  const base = doc.trimEnd();
  return base.length > 0 ? `${base}\n\n${block}\n` : `${block}\n`;
}

/** 블록만 제거하고 나머지 문서는 보존한다 */
export function removeBlock(doc: string, marker: string): string {
  const s = startTag(marker);
  const e = endTag(marker);
  const si = doc.indexOf(s);
  const ei = doc.indexOf(e);
  if (si === -1 || ei === -1 || ei < si) return doc;
  const out = doc.slice(0, si) + doc.slice(ei + e.length);
  return out.replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
}

/** 블록 내부 내용만 뽑아낸다 (드리프트 판정용) */
export function extractBlock(doc: string, marker: string): string | null {
  const s = startTag(marker);
  const e = endTag(marker);
  const si = doc.indexOf(s);
  const ei = doc.indexOf(e);
  if (si === -1 || ei === -1 || ei < si) return null;
  return doc.slice(si + s.length, ei).trim();
}
