/** 허브 다이아몬드 · 상시업무 대분류 (고정 5종) */
export const ROUTINE_CATEGORIES = [
  '채용 운영',
  '학습 지원',
  '직원 소통',
  '자산·시설',
  '문서·행정',
] as const;

export type RoutineCategory = (typeof ROUTINE_CATEGORIES)[number];

const LEGACY_CATEGORY_ALIASES: Record<string, RoutineCategory> = {
  채용: '채용 운영',
  '채용 운영': '채용 운영',
  교육: '학습 지원',
  '교육 운영': '학습 지원',
  '학습 지원': '학습 지원',
  학습: '학습 지원',
  소통: '직원 소통',
  '직원 소통': '직원 소통',
  시설: '자산·시설',
  자산: '자산·시설',
  '자산·시설': '자산·시설',
  '자산·시설 관리': '자산·시설',
  행정: '문서·행정',
  '문서·행정': '문서·행정',
  '문서·행정 지원': '문서·행정',
  인사관리: '채용 운영',
  학습성장: '학습 지원',
  운영지원: '자산·시설',
  전산관리: '문서·행정',
};

export function normalizeRoutineCategory(value: string | null | undefined): RoutineCategory | null {
  if (!value?.trim()) return null;
  const trimmed = value.trim();
  if (LEGACY_CATEGORY_ALIASES[trimmed]) return LEGACY_CATEGORY_ALIASES[trimmed];
  const matched = ROUTINE_CATEGORIES.find((cat) => cat === trimmed);
  return matched ?? null;
}

export function getRoutineCategory(task: {
  category?: string | null;
  section?: string | null;
  title?: string;
}): RoutineCategory | null {
  const fromField = normalizeRoutineCategory(task.category) ?? normalizeRoutineCategory(task.section);
  if (fromField) return fromField;
  if (task.title) {
    const fromTitle = normalizeRoutineCategory(task.title);
    if (fromTitle) return fromTitle;
  }
  return null;
}

export function routineCategoryOptions(): { value: RoutineCategory; label: RoutineCategory }[] {
  return ROUTINE_CATEGORIES.map((cat) => ({ value: cat, label: cat }));
}

export function groupRoutineTasksByCategory<T extends { category?: string | null; section?: string | null; title?: string }>(
  tasks: T[],
): Record<RoutineCategory, T[]> {
  const groups = Object.fromEntries(ROUTINE_CATEGORIES.map((cat) => [cat, [] as T[]])) as Record<RoutineCategory, T[]>;
  for (const task of tasks) {
    const cat = getRoutineCategory(task) ?? '채용 운영';
    groups[cat].push(task);
  }
  return groups;
}

/** 탭·허브 슬롯용 — 제목이 대분류명과 일치하는 대표 task 우선 */
export function pickRoutineCategoryTask<
  T extends { id: string; category?: string | null; section?: string | null; title?: string },
>(tasks: T[], category: RoutineCategory): T | null {
  const grouped = groupRoutineTasksByCategory(tasks);
  const inCategory = grouped[category];
  const shell = inCategory.find((task) => task.title?.trim() === category);
  return shell ?? inCategory[0] ?? null;
}
