/**
 * 链接标签自动派生规则（产品确认版，2026-08-28）：
 *
 * 标签与「产品链接」一一对应 —— 每条链接因 印花数量/工艺/物流 不同而价格不同
 * （价格矩阵维度 = 印花数量·工艺 × 物流 × 尺码 × 颜色），因此标签按链接名称解析：
 *
 * - 印花数量：名称含「双面印花」→ 双面印花；否则含「单面印花」→ 单面印花；
 * - 工艺：名称含「直喷」「不打印」「光板」→ 对应标签（可多个）；都不含 → 默认「烫画」；
 * - 物流：名称含「不包邮」→ 不包邮；否则含「包邮」→ 包邮（先判「不包邮」，避免子串误命中）。
 *
 * 这些分组（印花数量 / 印刷工艺 / 物流渠道）下的标签为派生数据，不接受手动写入；
 * 其他分组保持人工管理。
 */

/** 自动（派生）标签组名匹配：命中即视为族托管，手输的这类标签会被剔除 */
export function isAutoTagGroupName(name: string): boolean {
  return /物流|工艺|位置|印花数量/.test(name);
}

export interface DerivedTagGroupSpec {
  /** 标签组名（查找用 includes 匹配，缺失时自动建组） */
  group: string;
  /** 组内规则标签（缺失时自动建标） */
  tags: string[];
}

/** 派生标签所属组及其全部合法取值（光板 = 不打印，不单独设标签） */
export const DERIVED_TAG_GROUP_SPECS: DerivedTagGroupSpec[] = [
  { group: '物流渠道', tags: ['包邮', '不包邮'] },
  { group: '印花数量', tags: ['单面印花', '双面印花'] },
  { group: '印刷工艺', tags: ['烫画', '直喷', '不打印'] },
];

/** 工艺关键字 → 标签名（光板即为不打印） */
const CRAFT_KEYWORD_MAP: Record<string, string> = {
  直喷: '直喷',
  不打印: '不打印',
  光板: '不打印',
};
const CRAFT_DEFAULT = '烫画';

/**
 * 由链接名称解析标签名集合（不含组信息）。
 * 确定性、纯函数 —— 同名链接在任何环境派生结果一致。
 */
export function deriveLinkTagNames(name: string | null | undefined): string[] {
  if (!name) return [];
  const names: string[] = [];

  // 「双面印花/单面印花」显式命中，或工艺段写作「直喷双面/直喷单面」的裸「双面/单面」；
  // 双面优先判断，避免「单面」误吞。名称完全没写且工艺非「不打印」时默认单面印花
  // （解析假设集中在整理脚本层，可审查可重跑；不打印/光板 无印花面，不补）
  const craftTags = new Set<string>();
  for (const [keyword, tagName] of Object.entries(CRAFT_KEYWORD_MAP)) {
    if (name.includes(keyword)) craftTags.add(tagName);
  }
  const noPrint = craftTags.has('不打印');
  if (name.includes('双面')) names.push('双面印花');
  else if (name.includes('单面')) names.push('单面印花');
  else if (!noPrint) names.push('单面印花');
  if (craftTags.size > 0) names.push(...craftTags);
  else names.push(CRAFT_DEFAULT);

  if (name.includes('不包邮')) names.push('不包邮');
  else if (name.includes('包邮')) names.push('包邮');

  return names;
}
