// v2.8 Morph safety guards — prevents catastrophic truncation, marker leakage,
// and accidental import deletion during native edit_file application.
// Ported from opencode-morph-fast-apply (MIT) with threshold values preserved.

export interface GuardResult {
  ok: boolean;
  reason?: string;
  charLoss?: number;
  lineLoss?: number;
}

const TRUNCATION_CHAR_THRESHOLD = 0.6;
const TRUNCATION_LINE_THRESHOLD = 0.5;

export function validateEditResult(
  original: string,
  updated: string,
  _filePath: string,
): GuardResult {
  if (original.length > 0 && updated.length > 0) {
    const charLoss = 1 - updated.length / original.length;
    const originalLines = original.split('\n').length;
    const updatedLines = updated.split('\n').length;
    const lineLoss = 1 - updatedLines / originalLines;

    if (charLoss > TRUNCATION_CHAR_THRESHOLD && lineLoss > TRUNCATION_LINE_THRESHOLD) {
      return {
        ok: false,
        reason: `Edit would truncate ${Math.round(charLoss * 100)}% of characters and ${Math.round(lineLoss * 100)}% of lines`,
        charLoss,
        lineLoss,
      };
    }
  }

  return { ok: true };
}

export function formatGuardError(guard: GuardResult, filePath: string): string {
  return `Edit guard rejected change to ${filePath}: ${guard.reason ?? 'unknown error'}`;
}
