/**
 * 残疾证号解析工具函数
 * 用于从残疾证号中提取残疾类别和等级信息
 */

/**
 * 残疾证解析结果接口
 */
export interface DisabilityIdParseResult {
  /** 残疾类别 */
  disabilityType: string | null;
  /** 残疾等级 */
  disabilityLevel: string | null;
  /** 是否成功解析 */
  isValid: boolean;
}

/**
 * 支持的残疾类别列表
 */
export const DISABILITY_TYPES = [
  '视力残疾',
  '听力残疾',
  '言语残疾',
  '肢体残疾',
  '智力残疾',
  '精神残疾',
  '多重残疾'
] as const;

/**
 * 支持的残疾等级列表
 */
export const DISABILITY_LEVELS = [
  '一级',
  '二级',
  '三级',
  '四级'
] as const;

/**
 * 从残疾证号中解析残疾类别和等级
 *
 * 残疾证号常见格式:
 * - [类别]残疾[序列号][等级] 如: "视力残疾123456一级"
 * - [类别][序列号][等级] 如: "肢体123456二级"
 *
 * @param disabilityId 残疾证号
 * @returns 解析结果
 */
export function parseDisabilityId(disabilityId: string): DisabilityIdParseResult {
  if (!disabilityId || disabilityId.trim().length === 0) {
    return { disabilityType: null, disabilityLevel: null, isValid: false };
  }

  const cleanedId = disabilityId.trim();

  // 解析残疾类别
  const disabilityType = extractDisabilityType(cleanedId);

  // 解析残疾等级
  const disabilityLevel = extractDisabilityLevel(cleanedId);

  // 至少解析出一个字段才算成功
  const isValid = disabilityType !== null || disabilityLevel !== null;

  return { disabilityType, disabilityLevel, isValid };
}

/**
 * 从残疾证号中提取残疾类别
 *
 * @param disabilityId 残疾证号
 * @returns 残疾类别，未找到返回 null
 */
function extractDisabilityType(disabilityId: string): string | null {
  // 按优先级匹配，先匹配完整类别名称
  // 完整格式: "视力残疾"
  const fullMatch = disabilityId.match(/(视力残疾|听力残疾|言语残疾|肢体残疾|智力残疾|精神残疾|多重残疾)/);
  if (fullMatch) {
    return fullMatch[1];
  }

  // 简写格式: "视力"、"听力"等（后面可能跟"残"或其他字符）
  const shortMatch = disabilityId.match(/(视力|听力|言语|肢体|智力|精神|多重)/);
  if (shortMatch) {
    return `${shortMatch[1]}残疾`;
  }

  return null;
}

/**
 * 从残疾证号中提取残疾等级
 *
 * @param disabilityId 残疾证号
 * @returns 残疾等级，未找到返回 null
 */
function extractDisabilityLevel(disabilityId: string): string | null {
  // 匹配等级: "一级"、"二级"、"三级"、"四级"
  // 注意：不能使用\b边界，因为中文不支持单词边界
  const levelPattern = /([一二三四]级)(?=[^一二三四]|$)/;

  const match = disabilityId.match(levelPattern);
  if (match) {
    return match[1];
  }

  // 尝试匹配数字格式: "1级"、"2级"等
  const digitPattern = /([1-4])级(?=[^0-9]|$)/;
  const digitMatch = disabilityId.match(digitPattern);

  if (digitMatch) {
    const digit = digitMatch[1];
    const chineseNums = ['一', '二', '三', '四'];
    return `${chineseNums[parseInt(digit, 10) - 1]}级`;
  }

  return null;
}

/**
 * 获取标准化的残疾类别列表
 * @returns 所有支持的残疾类别
 */
export function getStandardDisabilityTypes(): readonly string[] {
  return DISABILITY_TYPES;
}

/**
 * 获取标准化的残疾等级列表
 * @returns 所有支持的残疾等级
 */
export function getStandardDisabilityLevels(): readonly string[] {
  return DISABILITY_LEVELS;
}

/**
 * 验证残疾类别是否有效
 * @param type 残疾类别
 * @returns 是否为有效的残疾类别
 */
export function isValidDisabilityType(type: string): boolean {
  return DISABILITY_TYPES.includes(type as any);
}

/**
 * 验证残疾等级是否有效
 * @param level 残疾等级
 * @returns 是否为有效的残疾等级
 */
export function isValidDisabilityLevel(level: string): boolean {
  return DISABILITY_LEVELS.includes(level as any);
}
