'use client' import type { InvoiceInboxItem, DocumentClassificationType } from '@/types' import type { InvoiceExtractionResult } from '@/extensions/general/invoice-inbox/types' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { getStatusLabel, getStatusVariant, getConfidenceLabel, formatExtractionSummary, getDocumentTypeLabel, getDocumentTypeVariant, } from '@/lib/extensions/invoice-inbox-utils' import { Mail, Upload, FileText, Receipt, Landmark } from 'lucide-react' interface DocumentInboxCardProps { item: InvoiceInboxItem onClick: () => void } function formatRelativeTime(dateStr: string): string { const now = new Date() const date = new Date(dateStr) const diffMs = now.getTime() - date.getTime() const diffMin = Math.floor(diffMs / 60000) if (diffMin < 1) return 'Just nu' if (diffMin < 60) return `${diffMin} min sedan` const diffH = Math.floor(diffMin / 60) if (diffH < 24) return `${diffH} tim sedan` const diffD = Math.floor(diffH / 24) if (diffD === 1) return 'Igår' return `${diffD} dagar sedan` } function formatAmount(amount: number, currency: string = 'SEK'): string { return new Intl.NumberFormat('sv-SE', { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(amount) } function getDocumentIcon(type: DocumentClassificationType) { switch (type) { case 'receipt': return case 'government_letter': return default: return } } function getSummaryText(item: InvoiceInboxItem): { label: string; total: number; currency: string } { const type = item.document_type ?? 'supplier_invoice' switch (type) { case 'supplier_invoice': { const extraction = item.extracted_data as unknown as InvoiceExtractionResult | null const summary = formatExtractionSummary(extraction) return { label: (item.supplier as { name?: string } | undefined)?.name ?? (summary.supplierName || 'Okänd leverantör'), total: summary.total, currency: summary.currency, } } case 'receipt': { const receipt = item.receipt as { merchant_name?: string; total_amount?: number; currency?: string } | undefined return { label: receipt?.merchant_name ?? 'Okänd handlare', total: receipt?.total_amount ?? 0, currency: receipt?.currency || 'SEK', } } case 'government_letter': { return { label: item.email_from ?? 'Okänd avsändare', total: 0, currency: 'SEK', } } default: { return { label: 'Granska manuellt', total: 0, currency: 'SEK' } } } } export default function DocumentInboxCard({ item, onClick }: DocumentInboxCardProps) { const confidence = getConfidenceLabel(item.confidence) const statusVariant = getStatusVariant(item.status) as 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' const confidenceVariant = confidence.variant as 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' const docType = (item.document_type ?? 'supplier_invoice') as DocumentClassificationType const docTypeVariant = getDocumentTypeVariant(docType) as 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' const fileName = (item.document as { file_name?: string } | undefined)?.file_name ?? 'Okänd fil' const { label: summaryLabel, total, currency } = getSummaryText(item) return ( {item.source === 'email' ? ( ) : ( )} {getDocumentIcon(docType)} {fileName} {summaryLabel} {total > 0 && ( {formatAmount(total, currency)} )} {getDocumentTypeLabel(docType)} {item.confidence != null && ( {confidence.label} )} {getStatusLabel(item.status)} {formatRelativeTime(item.created_at)} ) }