/**
 * 标签系统（双轨制）。
 *
 * 设计见 plan.md「决策 1」：
 * - 应用 tags 表存 UI 增强（name/color），记账时把 #tagName 写入 narration（Beancount 原生 tag 语法）
 * - 与分类不同：标签会写回 .bean（用 #tag 语法），桌面端可读
 */

export interface Tag {
  id: string;
  name: string;     // 同时作为 #tag 名（写回 .bean），需符合 [\w-]
  color: string;    // UI 增强（仅本地，不写回 .bean）
}

/** 校验 tag 名是否合法（Beancount #tag 语法：[\w-]，即字母数字下划线连字符）。 */
export function isValidTagName(name: string): boolean {
  return /^[\w-]+$/.test(name) && name.length > 0 && name.length <= 32;
}

/** 把 Tag 列表序列化为 .bean 的 #tag 语法（追加到 narration 末尾）。 */
export function tagsToBeanSyntax(tags: Tag[]): string {
  return tags.filter(t => isValidTagName(t.name)).map(t => ` #${t.name}`).join('');
}

/** 从 .bean narration 中提取 #tag 名（解析方向）。 */
export function extractTagNames(narration: string): string[] {
  return [...narration.matchAll(/#([\w-]+)/g)].map(m => m[1]);
}

/** 根据 tag 名集合，从 Tag 库匹配出完整的 Tag 对象（用于 UI 展示颜色等）。 */
export function resolveTagsByName(names: string[], allTags: Tag[]): Tag[] {
  const byName = new Map(allTags.map(t => [t.name, t]));
  return names.map(n => byName.get(n)).filter((t): t is Tag => t !== undefined);
}
