/*
 * 라우트 → 화면명(탭 라벨) 매핑 — MDI 탭 라벨 해소(design.md §2.7-2).
 *
 * 1) 정적 경로: 사이드바 네비 정의(AppShell)와 정합하는 라벨 테이블.
 * 2) 행사 스코프 동적 경로(/events/:eventId/...): 패턴 매칭.
 * 3) 미등록 경로: 경로 세그먼트 기반 축약 폴백(:id 유사 세그먼트 제외).
 *
 * screens/** 를 import 하지 않는다(라벨은 여기서 단일 관리). 네비 라벨과 동일 문자열을 사용해
 * 사이드바 활성 표시와 탭 라벨이 일치하도록 한다.
 */

/** 정적(정확 일치) 경로 → 라벨. AppShell NAV/DOMAIN/WORK 정의와 동일 문자열. */
const STATIC_LABELS: Record<string, string> = {
  // 주 메뉴
  '/schedule': '전시 일정',
  '/ops/operations': '현장운영',
  '/analytics': '경영분석',
  '/docs': '서류·마일스톤',
  '/settlement': '정산',
  '/admin': '관리자',
  // 도메인 모듈
  '/halls': '홀 배정',
  '/logistics': '반입·반출',
  '/auctions': '공사 옥션',
  '/visitors': '관람객',
  '/visitors/checkin': '체크인 데스크',
  '/leads': '리드',
  '/campaigns': '마케팅',
  '/sponsorship': '스폰서십',
  '/cms': '콘텐츠 CMS',
  '/cms/microsite': '마이크로사이트 빌더',
  '/cms/i18n': '다국어 CMS',
  // 업무 공통
  '/work/worklog': '업무일지',
  '/work/schedule': '일정',
  '/work/message': '쪽지',
  '/work/notice': '공지',
  '/work/meeting': '회의록',
  '/work/report': '업무보고',
  '/work/opinion': '의견접수',
  '/work/search': '통합검색',
  // 개인·알림
  '/notifications': '알림센터',
  '/me': '마이페이지',
  // 서류·수주
  '/docs/authoring': '신고서류 작성',
  '/contractor/dashboard': '수주 부스',
  // 관리자 하위
  '/admin/login-slides': '로그인 슬라이드',
  '/admin/audit': '감사 로그',
  '/admin/settings': '시스템 설정',
  '/admin/masterdata/rulesets': '룰셋 버전',
  '/admin/tenants': '테넌트 관리',
  '/admin/users': '사용자 관리',
  '/admin/roles': '역할 관리',
  '/admin/codes': '공통 코드',
  '/admin/menus': '메뉴 관리',
  '/admin/messages': '메시지 관리',
};

/** 동적 경로 패턴(정규식) → 라벨. 구체적 규칙을 먼저 둔다. */
const PATTERN_LABELS: { re: RegExp; label: string }[] = [
  { re: /^\/events\/[^/]+\/dashboard$/, label: '대시보드' },
  { re: /^\/events\/[^/]+\/booths\/[^/]+\/home$/, label: '참가업체 홈' },
  { re: /^\/events\/[^/]+\/halls\/[^/]+\/layout$/, label: '플로어플랜 스튜디오' },
  { re: /^\/events\/[^/]+\/halls\/[^/]+\/comparison$/, label: 'AI 배치안 비교' },
  { re: /^\/events\/[^/]+\/booths\/[^/]+\/design$/, label: '부스 설계 스튜디오' },
  { re: /^\/events\/[^/]+\/booths\/[^/]+\/utility\/order$/, label: '유틸리티 신청' },
  { re: /^\/events\/[^/]+\/booths\/[^/]+\/utility$/, label: '유틸리티 배선' },
  { re: /^\/events\/[^/]+\/booths\/[^/]+\/compliance$/, label: '규정 검증' },
  { re: /^\/events\/[^/]+\/halls\/[^/]+\/booths\/[^/]+\/review$/, label: '검수 상세' },
  { re: /^\/events\/[^/]+\/halls\/[^/]+\/approvals$/, label: '검수 대기열' },
  { re: /^\/events\/[^/]+\/booths\/[^/]+\/gallery$/, label: '시각화 갤러리' },
  { re: /^\/auctions\/[^/]+\/award$/, label: '낙찰 비교' },
  { re: /^\/auctions\/[^/]+$/, label: '옥션 상세' },
];

/** 폴백 세그먼트 → 라벨(경로 기반 축약에 사용). */
const SEGMENT_LABELS: Record<string, string> = {
  dashboard: '대시보드',
  layout: '플로어플랜',
  design: '설계',
  utility: '배선',
  gallery: '갤러리',
  approvals: '검수',
  review: '검수 상세',
  admin: '관리자',
  work: '업무',
  cms: 'CMS',
  auctions: '옥션',
};

/** id 유사 세그먼트(폴백 라벨에서 제외) — UUID·숫자·짧은 코드. */
function isIdLike(seg: string): boolean {
  return /^[0-9]+$/.test(seg) || /^[0-9a-fA-F-]{8,}$/.test(seg) || /^[A-Z]\d+$/.test(seg);
}

/** 라우트 경로 → 탭 라벨 해소. */
export function labelForPath(path: string): string {
  const clean = path.split('?')[0].split('#')[0];
  if (STATIC_LABELS[clean]) return STATIC_LABELS[clean];
  for (const { re, label } of PATTERN_LABELS) {
    if (re.test(clean)) return label;
  }
  // 폴백: 뒤에서부터 id 아닌 첫 세그먼트를 라벨화.
  const segs = clean.split('/').filter(Boolean);
  for (let i = segs.length - 1; i >= 0; i -= 1) {
    const seg = segs[i];
    if (isIdLike(seg)) continue;
    return SEGMENT_LABELS[seg] ?? seg;
  }
  return '문서';
}
