/**
 * propPatcher.ts
 *
 * JSX code 字符串中的 prop 替换工具函数。
 * 用于快捷操作（quickInput / quickSelect / quickToggle）直接修改组件 code，
 * 不经过 agent，通过 POST /canvas-patch 推送给前端画布。
 */

/**
 * 替换 JSX code 字符串中某个字符串类型 prop 的值。
 * 处理以下格式：
 *   propName="value"
 *   propName={'value'}
 * 如果 prop 不存在，在 /> 前追加。
 */
export function patchStringProp(code: string, propName: string, newValue: string): string {
  // 替换双引号格式: propName="old"
  const dqRegex = new RegExp(`(${propName}=)"([^"]*)"`, 'g');
  if (dqRegex.test(code)) {
    return code.replace(new RegExp(`(${propName}=)"([^"]*)"`, 'g'), `$1"${newValue}"`);
  }
  // 替换单引号花括号格式: propName={'old'}
  const sqRegex = new RegExp(`(${propName}=)\\{'([^']*)'\\}`, 'g');
  if (sqRegex.test(code)) {
    return code.replace(new RegExp(`(${propName}=)\\{'([^']*)'\\}`, 'g'), `$1"${newValue}"`);
  }
  // prop 不存在：在 /> 前追加
  if (code.includes('/>')) {
    return code.replace(/(\s*\/>)/, ` ${propName}="${newValue}"$1`);
  }
  // prop 不存在，无自闭合标签：在第一个 > 前追加
  return code.replace(/>/, ` ${propName}="${newValue}">`);
}

/**
 * 替换 JSX code 字符串中某个枚举类型 prop 的值（字符串格式）。
 * 与 patchStringProp 相同逻辑，单独命名便于语义区分。
 */
export function patchEnumProp(code: string, propName: string, newValue: string): string {
  return patchStringProp(code, propName, newValue);
}

/**
 * 读取 JSX code 字符串中某个 boolean prop 的当前值。
 * 处理格式：
 *   legendShow={true}  → true
 *   legendShow={false} → false
 *   legendShow         → true（裸属性）
 *   不存在             → defaultValue
 */
export function readBooleanProp(code: string, propName: string, defaultValue: boolean): boolean {
  const falseRegex = new RegExp(`${propName}=\\{false\\}`);
  if (falseRegex.test(code)) return false;
  const trueRegex = new RegExp(`${propName}=\\{true\\}|\\b${propName}\\b`);
  if (trueRegex.test(code)) return true;
  return defaultValue;
}

/**
 * 替换 JSX code 字符串中某个 boolean prop 的值。
 * 处理格式：
 *   legendShow={true}  → legendShow={false}
 *   legendShow={false} → legendShow={true}
 *   legendShow（裸）   → legendShow={false}
 *   不存在             → 追加 legendShow={true/false}
 */
export function patchBooleanProp(code: string, propName: string, newValue: boolean): string {
  const valueStr = `{${newValue}}`;
  // 替换 {true} 或 {false}
  const boolRegex = new RegExp(`(${propName})=\\{(true|false)\\}`, 'g');
  if (boolRegex.test(code)) {
    return code.replace(new RegExp(`(${propName})=\\{(true|false)\\}`, 'g'), `$1=${valueStr}`);
  }
  // 替换裸属性（propName 无值）
  const bareRegex = new RegExp(`\\b(${propName})\\b(?!=)`, 'g');
  if (bareRegex.test(code)) {
    return code.replace(new RegExp(`\\b(${propName})\\b(?!=)`, 'g'), `$1=${valueStr}`);
  }
  // prop 不存在：追加
  if (code.includes('/>')) {
    return code.replace(/(\s*\/>)/, ` ${propName}=${valueStr}$1`);
  }
  return code.replace(/>/, ` ${propName}=${valueStr}>`);
}
