<script lang="ts">
  /**
   * Phase 1C — md_status 표시 badge.
   *
   * MarkdownDoc 내부 + PDF iframe fallback 양쪽에서 재사용된다.
   * `md_status='failed'` 같은 경우 MarkdownDoc 가 fallback 으로 빠지거나
   * PDF 분기에서 canShowMarkdown=false 라 컴포넌트 자체가 안 렌더링되는데도,
   * 사용자는 "왜 markdown 이 안 보이는지" 알 수 있어야 하므로 분리된 컴포넌트로 둠.
   *
   * 정책 (사용자 결정):
   *   - pending 은 표시 안 함 (legacy 9792 건에 모두 노출되는 시각적 노이즈 회피).
   *   - processing/success/partial/skipped/failed 5 상태 표시 (partial = 대형 split 일부 실패).
   *   - success 도 작은 chip 으로 노출 — 1D pilot 에서 markdown 화면 식별용.
   *   - skipped/failed 는 tooltip 으로 reason/error 보조 표시.
   *
   * Quality summary tooltip:
   *   - md_extraction_quality 의 실제 shape: { score, metrics: {...}, warnings: [...] }
   *   - metrics 안의 numeric 키 일부만 추출. null/undefined 모두 방어.
   *   - 정식 quality chip 은 1D pilot 후 별도 결정.
   */
  import Badge from '$lib/components/ui/Badge.svelte';

  type Props = {
    mdStatus?: string | null;
    mdExtractionError?: string | null;
    mdExtractionQuality?: Record<string, unknown> | null;
  };

  let {
    mdStatus = null,
    mdExtractionError = null,
    mdExtractionQuality = null,
  }: Props = $props();

  function qualitySummary(q: Record<string, unknown> | null | undefined): string | null {
    if (!q || typeof q !== 'object') return null;

    // marker_worker 는 { score, metrics: {...}, warnings: [...] } 로 씀.
    // metrics nested 가 정식 위치. flat 도 향후 호환 위해 fallback.
    const rawMetrics = (q as { metrics?: unknown }).metrics;
    const metrics: Record<string, unknown> =
      rawMetrics && typeof rawMetrics === 'object' ? (rawMetrics as Record<string, unknown>) : q;

    const parts: string[] = [];

    const headings = metrics.markdown_heading_count;
    if (typeof headings === 'number') parts.push(`headings: ${headings}`);

    const tableRows = metrics.markdown_table_row_count;
    if (typeof tableRows === 'number') parts.push(`table rows: ${tableRows}`);

    const images = metrics.markdown_image_count;
    if (typeof images === 'number') parts.push(`images: ${images}`);

    const ratio = metrics.text_length_ratio ?? metrics.text_ratio;
    if (typeof ratio === 'number' && Number.isFinite(ratio)) {
      parts.push(`text ratio: ${ratio.toFixed(2)}`);
    }

    const warnings = (q as { warnings?: unknown }).warnings;
    if (Array.isArray(warnings) && warnings.length) {
      parts.push(`warnings: ${warnings.join(', ')}`);
    }

    return parts.length ? parts.join('\n') : null;
  }

  type BadgeSpec = {
    tone: 'neutral' | 'success' | 'warning' | 'error' | 'accent';
    label: string;
    tooltip: string | null;
  };

  let badge = $derived.by<BadgeSpec | null>(() => {
    if (!mdStatus || mdStatus === 'pending') return null;
    switch (mdStatus) {
      case 'processing':
        return { tone: 'accent', label: 'Markdown 변환 중', tooltip: null };
      case 'success':
      case 'completed': // API field_validator 가 DB 'success'→'completed' remap (S1 backend) — 동의어
        return {
          tone: 'success',
          label: 'Markdown',
          tooltip: qualitySummary(mdExtractionQuality),
        };
      case 'partial':
        return {
          tone: 'warning',
          label: 'Markdown 일부',
          tooltip: qualitySummary(mdExtractionQuality) ?? mdExtractionError ?? null,
        };
      case 'skipped':
        return {
          tone: 'neutral',
          label: 'Markdown 제외',
          tooltip: mdExtractionError ?? '표 중심 문서 등 변환 제외 정책 적용',
        };
      case 'failed':
        return {
          tone: 'error',
          label: 'Markdown 변환 실패',
          tooltip: mdExtractionError ?? null,
        };
      default:
        return null;
    }
  });
</script>

{#if badge}
  <Badge tone={badge.tone} title={badge.tooltip ?? undefined}>{badge.label}</Badge>
{/if}
