import type { CoreConfig } from './types';

/**
 * EN 常见标点（默认集合）
 *
 * 说明：此集合只用于“关键词命中判定”的两端 strip，不影响 tokenize（仍为极简派）。
 * 必须全端一致；后续若扩展，也必须通过 configVersion 管理。
 */
export const DEFAULT_PUNCTUATION_STRIP_SET_EN: string[] = [
  ',',
  '.',
  '!',
  '?',
  ':',
  ';',
  '"',
  "'",
  '…',
  '—',
  '–',
  '(',
  ')',
  '[',
  ']',
  '{',
  '}',
];

function buildStripSet(config?: Pick<CoreConfig, 'punctuationStripSetEN'>): Set<string> {
  const list = config?.punctuationStripSetEN?.length ? config.punctuationStripSetEN : DEFAULT_PUNCTUATION_STRIP_SET_EN;
  return new Set(list);
}

/**
 * 归一化一个 token，用于 EN 关键词命中（全词等值匹配）。
 *
 * 口径（必须）：
 * - lowercase
 * - strip 两端常见标点（可重复剥离，例如 `"\"but,\""`）
 * - 不允许 substring/contains
 */
export function normalizeENKeyword(tokenText: string, config?: Pick<CoreConfig, 'punctuationStripSetEN'>): string {
  const stripSet = buildStripSet(config);

  let s = String(tokenText ?? '').toLowerCase();
  if (!s) return '';

  // 仅剥离两端的“常见标点”，内部字符不处理
  let start = 0;
  let end = s.length;

  while (start < end && stripSet.has(s[start]!)) start++;
  while (end > start && stripSet.has(s[end - 1]!)) end--;

  // 如果剥离后还剩空白，再做一次 trim（避免 `"but "` 这种输入）
  return s.slice(start, end).trim();
}

/**
 * EN 关键词命中：全词等值匹配（禁止 substring）。
 */
export function matchENKeyword(tokenText: string, keyword: string, config?: Pick<CoreConfig, 'punctuationStripSetEN'>): boolean {
  const a = normalizeENKeyword(tokenText, config);
  const b = normalizeENKeyword(keyword, config);
  if (!a || !b) return false;
  return a === b;
}

