| import type { UsageLog } from '@/types' |
|
|
| type Translate = (key: string) => string |
|
|
| const knownImageSizeSources = new Set(['output', 'input', 'default', 'legacy']) |
| const knownImageBillingSizes = new Set(['1K', '2K', '4K', 'mixed']) |
|
|
| type ImageUsageRow = Pick< |
| UsageLog, |
| 'image_size' | 'image_input_size' | 'image_output_size' | 'image_size_source' | 'image_size_breakdown' |
| > |
|
|
| const trimmed = (value: string | null | undefined): string => value?.trim() ?? '' |
|
|
| export const formatImageBillingSize = (row: ImageUsageRow | null | undefined, t: Translate): string => { |
| const size = trimmed(row?.image_size) |
| if (!size) { |
| return t('usage.imageSizeNotRecorded') |
| } |
| if (knownImageBillingSizes.has(size)) { |
| return size |
| } |
| return `${t('usage.imageSizeLegacyUnstandardized')}: ${size}` |
| } |
|
|
| export const formatImageInputSize = (row: ImageUsageRow | null | undefined, t: Translate): string => { |
| const size = trimmed(row?.image_input_size) |
| return size || t('usage.imageSizeUnknown') |
| } |
|
|
| export const formatImageOutputSize = (row: ImageUsageRow | null | undefined, t: Translate): string => { |
| const size = trimmed(row?.image_output_size) |
| return size || t('usage.imageSizeUnknown') |
| } |
|
|
| export const formatImageSizeSource = (row: ImageUsageRow | null | undefined, t: Translate): string => { |
| const source = trimmed(row?.image_size_source).toLowerCase() |
| if (knownImageSizeSources.has(source)) { |
| return t(`usage.imageSizeSource${source.charAt(0).toUpperCase()}${source.slice(1)}`) |
| } |
| if (trimmed(row?.image_size)) { |
| return t('usage.imageSizeSourceLegacy') |
| } |
| return t('usage.imageSizeSourceMissing') |
| } |
|
|
| export const formatImageSizeBreakdown = (row: ImageUsageRow | null | undefined): string => { |
| const breakdown = row?.image_size_breakdown |
| if (!breakdown || Object.keys(breakdown).length === 0) { |
| return '' |
| } |
| return ['1K', '2K', '4K'] |
| .filter((tier) => (breakdown[tier] ?? 0) > 0) |
| .map((tier) => `${tier} x ${breakdown[tier]}`) |
| .join(', ') |
| } |
|
|