import * as fs from 'fs';
import * as path from 'path';

// ── 硬编码的已知 leave_code（作为 fallback 和特定业务引用）──

export const LEAVE_CODES = {
  PERSONAL_LEAVE: 'c9c787fa-fa50-4939-80a5-6cdd0c581363',
  MARRIAGE_LEAVE: '7fd33167-f7f6-4b0f-8cbb-de16b0532c54',
  ANNUAL_LEAVE_2022: '8f8906c6-a25f-4585-bbc6-6a8188e02bd4',
  ANNUAL_LEAVE_2023: '013d5813-397b-465b-8ae3-898986ab8ca9',
  ANNUAL_LEAVE_2024: '7f12966b-3171-46aa-95fa-ea8947f0676e',
  ANNUAL_LEAVE_2025: '22f7226b-9aa2-4e14-a30d-8edee7064168',
  COMP_LEAVE_OLD: '1aee43b7-e9be-4d96-91a4-8782207588f5',
  COMP_LEAVE: '3346746d-bfb4-4ffe-8f87-0e09e6d50ccd',
  SICK_LEAVE: 'af2b528c-5882-4a88-b684-fcf0f95080b5',
  MATERNITY_LEAVE: '2dbc4cf9-d2d3-4c47-b34e-ca0598cecfd5',
  PRENATAL_CHECKUP_LEAVE: '94c39863-d073-451a-8568-79f3875c8c31',
  DIFFICULT_BIRTH_LEAVE: '43f6b454-e04b-4be3-9fa1-ed950d6f644e',
  PATERNITY_LEAVE: '9d59773b-6654-415a-b341-c37352162ea4',
  NURSING_LEAVE: 'f79fe2af-a50e-482e-973f-f7775fbfa087',
  BEREAVEMENT_LEAVE: '1e3c9463-83f8-41c0-bde0-ff2b79674d5b',
  PARENTAL_LEAVE: '369a6b68-47a1-4b1e-8845-c2faf979854c',
};

export const ANNUAL_LEAVE_RELEASE_CODE = '22f7226b-9aa2-4e14-a30d-8edee7064168';

/** 硬编码标签（作为 fallback） */
export const LEAVE_TYPE_LABELS: Record<string, string> = {
  [LEAVE_CODES.PERSONAL_LEAVE]: '事假',
  [LEAVE_CODES.MARRIAGE_LEAVE]: '婚假',
  [LEAVE_CODES.ANNUAL_LEAVE_2022]: '2022年年假',
  [LEAVE_CODES.ANNUAL_LEAVE_2023]: '2023年年假',
  [LEAVE_CODES.ANNUAL_LEAVE_2024]: '2024年年假',
  [LEAVE_CODES.ANNUAL_LEAVE_2025]: '2025年年假',
  [LEAVE_CODES.COMP_LEAVE_OLD]: '调休',
  [LEAVE_CODES.COMP_LEAVE]: '调休假',
  [LEAVE_CODES.SICK_LEAVE]: '病假',
  [LEAVE_CODES.MATERNITY_LEAVE]: '产假',
  [LEAVE_CODES.PRENATAL_CHECKUP_LEAVE]: '产检假',
  [LEAVE_CODES.DIFFICULT_BIRTH_LEAVE]: '难产假',
  [LEAVE_CODES.PATERNITY_LEAVE]: '陪产假',
  [LEAVE_CODES.NURSING_LEAVE]: '哺乳假',
  [LEAVE_CODES.BEREAVEMENT_LEAVE]: '丧假',
  [LEAVE_CODES.PARENTAL_LEAVE]: '育儿假',
};

export const ALL_SUPPORTED_LEAVE_CODES = Object.values(LEAVE_CODES);

/** 匹配 "YYYY年年假" 的 leaveType 字符串 */
export const ANNUAL_LEAVE_YEAR_REGEX = /(\d{4})\s*年\s*年假/;

/** 从 leaveType 中解析年份。不匹配返回 null。 */
export function extractAnnualLeaveYear(leaveType: string | null | undefined): number | null {
  if (!leaveType) return null;
  const match = leaveType.match(ANNUAL_LEAVE_YEAR_REGEX);
  return match ? Number(match[1]) : null;
}

// ── JSON 缓存：存储从钉钉 API 动态拉取的假期类型 ──

export interface CachedLeaveType {
  leave_code: string;
  leave_name: string;
}

const CACHE_FILE = path.join(__dirname, '..', '..', '..', '..', '..', 'data', 'leave-types-cache.json');

/** 读取缓存的假期类型列表 */
export function loadLeaveTypesCache(): CachedLeaveType[] {
  try {
    if (fs.existsSync(CACHE_FILE)) {
      const data = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));
      return Array.isArray(data.leaveTypes) ? data.leaveTypes : [];
    }
  } catch {
    // 缓存损坏，忽略
  }
  return [];
}

/** 写入缓存 */
export function saveLeaveTypesCache(leaveTypes: CachedLeaveType[]): void {
  const dir = path.dirname(CACHE_FILE);
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir, { recursive: true });
  }
  fs.writeFileSync(CACHE_FILE, JSON.stringify({
    updatedAt: new Date().toISOString(),
    leaveTypes,
  }, null, 2), 'utf-8');
}

/**
 * 获取所有应查询的 leave_code 列表。
 * 合并硬编码列表 + 缓存（来自钉钉 API），去重后返回。
 */
export function getAllLeaveCodesFromCache(): string[] {
  const codes = new Set(ALL_SUPPORTED_LEAVE_CODES);
  const cached = loadLeaveTypesCache();
  for (const item of cached) {
    codes.add(item.leave_code);
  }
  return [...codes];
}

/**
 * 获取假期类型名称。优先用缓存名称，回退到硬编码标签。
 */
export function getLeaveTypeName(leaveCode: string): string {
  const cached = loadLeaveTypesCache();
  const found = cached.find((item) => item.leave_code === leaveCode);
  if (found) return found.leave_name;
  return LEAVE_TYPE_LABELS[leaveCode] || '';
}

export function getLeaveCode(leaveType: string): string {
  // 先查缓存
  const cached = loadLeaveTypesCache();
  const found = cached.find((item) => item.leave_name === leaveType);
  if (found) return found.leave_code;

  // 回退到硬编码
  const mapping: Record<string, string> = {
    '2023年年假': LEAVE_CODES.ANNUAL_LEAVE_2023,
    '2024年年假': LEAVE_CODES.ANNUAL_LEAVE_2024,
    '2025年年假': LEAVE_CODES.ANNUAL_LEAVE_2025,
    '婚假': LEAVE_CODES.MARRIAGE_LEAVE,
    '调休': LEAVE_CODES.COMP_LEAVE_OLD,
    '调休假': LEAVE_CODES.COMP_LEAVE,
  };
  return mapping[leaveType] || '';
}

export function getLeaveType(leaveCode: string): string {
  return getLeaveTypeName(leaveCode);
}
