/**
 * 数字键盘表达式编辑与求值（＋/－ 连续记账，如 20+15 直接出 35）。
 * 金额运算走 domain/decimal 的字符串十进制，无浮点误差。
 */
import { addDecimals, subtractDecimals } from '../../domain/core/decimal';

export type NumpadKey =
  | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
  | '.' | '+' | '-' | 'backspace';

const MAX_INT_DIGITS = 9;
const MAX_DECIMAL_DIGITS = 2;

/** 处理一次按键，返回新表达式字符串。 */
export function pressKey(expr: string, key: NumpadKey): string {
  if (key === 'backspace') return expr.slice(0, -1);

  if (key === '+' || key === '-') {
    if (expr === '') return ''; // 金额恒正，不允许运算符开头
    const last = expr[expr.length - 1];
    if (last === '+' || last === '-') return expr.slice(0, -1) + key; // 替换运算符
    return expr + key;
  }

  // 当前数字段（最后一个运算符之后）
  const seg = expr.split(/[+-]/).pop() ?? '';

  if (key === '.') {
    if (seg.includes('.')) return expr;
    if (seg === '') return expr + '0.';
    return expr + '.';
  }

  // 数字键
  if (seg.includes('.')) {
    const decimals = seg.split('.')[1] ?? '';
    if (decimals.length >= MAX_DECIMAL_DIGITS) return expr;
  } else if (seg === '0') {
    return expr.slice(0, -1) + key; // 前导零替换
  } else {
    // 整数位上限仅在段内无小数点时生效（'123456789.' 后仍可输小数）
    if (seg.length >= MAX_INT_DIGITS) return expr;
  }
  return expr + key;
}

/** 求值：忽略尾随运算符；空表达式返回空串。 */
export function evaluateExpression(expr: string): string {
  const cleaned = expr.replace(/[+-]$/, '');
  if (!cleaned) return '';
  // 按符号切分：'20+15-5.5' → ['20', '+15', '-5.5']
  const parts = cleaned.split(/(?=[+-])/).filter(Boolean);
  let sum = '0';
  for (const part of parts) {
    const negative = part.startsWith('-');
    const body = (negative || part.startsWith('+') ? part.slice(1) : part).replace(/\.$/, '');
    if (!body) continue; // 防御：剥完为空的段跳过（键盘不可达，但避免 parseDecimal 抛错）
    if (negative) sum = subtractDecimals(sum, body);
    else sum = addDecimals([sum, body]);
  }
  return sum;
}
