// 뷰어 타입 분류 단일 source — 상세페이지(/documents/[id])와 3-pane 중앙 리더
// (DocumentViewer)가 공유한다. 두 곳이 각자 getViewerType 을 두면 csv/hwp/office 분기가
// drift 하므로(이원화 재발) 여기 하나로 수렴한다.
//
// ⚠ 소비 컴포넌트는 이 함수가 낼 수 있는 모든 ViewerType 에 render 분기가 있어야 한다.
//   (분류 통합 ≠ render 통합 — 양쪽 컴포넌트의 {#if viewerType===...} 에 누락 없는지 확인.)

export type ViewerType =
  | 'article'
  | 'markdown'
  | 'hwp-markdown'
  | 'pdf'
  | 'preview-pdf'
  | 'image'
  | 'text'
  | 'synology'
  | 'cad'
  | 'unsupported';

const MARKDOWN = new Set(['md', 'txt']);
// csv/json/xml/html 은 markdown 으로 렌더하면 콤마/행이 한 문단으로 뭉친다 → <pre> 로 원형 보존.
const TEXT = new Set(['csv', 'json', 'xml', 'html']);
const HWP = new Set(['hwp', 'hwpx']);
// LibreOffice headless → PDF preview (/preview) 로 인앱 표시.
const OFFICE_PREVIEW = new Set(['docx', 'xlsx', 'pptx', 'odt', 'ods', 'odp']);
// Synology Office 네이티브 — 인앱 변환 부적합, 외부 편집기로.
const SYNOLOGY = new Set(['odoc', 'osheet']);
const IMAGE = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff']);
const CAD = new Set(['dwg', 'dxf']);

export function getViewerType(
  format: string | null | undefined,
  sourceChannel?: string | null,
): ViewerType {
  if (sourceChannel === 'news') return 'article';
  const f = (format ?? '').toLowerCase();
  if (MARKDOWN.has(f)) return 'markdown';
  if (f === 'pdf') return 'pdf';
  if (HWP.has(f)) return 'hwp-markdown';
  if (OFFICE_PREVIEW.has(f)) return 'preview-pdf';
  if (SYNOLOGY.has(f)) return 'synology';
  if (IMAGE.has(f)) return 'image';
  if (TEXT.has(f)) return 'text';
  if (CAD.has(f)) return 'cad';
  return 'unsupported';
}
