import { FeedSackColumnConfig } from '../types/counting.ts'; export function getFeedSackColumnType(cameraName: string): 'inbound' | 'usage' | 'outbound' { if (cameraName.includes('karung_masuk')) return 'inbound'; if (cameraName.includes('karung_keluar')) return 'outbound'; return 'usage'; } export function inferKandangIdFromCameraName(cameraName: string): number | null { const match = cameraName.toLowerCase().match(/^kandang_(\d+)_/); if (!match) { return null; } const parsed = Number(match[1]); return Number.isFinite(parsed) ? parsed : null; } export function normalizeFeedSackColumnConfig(column: FeedSackColumnConfig): FeedSackColumnConfig { const rawKandangId: unknown = (column as { kandangId?: unknown }).kandangId; let kandangId: number | null = null; if (typeof rawKandangId === 'number' && Number.isFinite(rawKandangId)) { kandangId = rawKandangId; } else if (typeof rawKandangId === 'string' && rawKandangId.trim().length > 0) { const parsed = Number(rawKandangId); kandangId = Number.isFinite(parsed) ? parsed : null; } else if (rawKandangId === undefined) { kandangId = inferKandangIdFromCameraName(column.cameraName); } return { ...column, type: column.type || getFeedSackColumnType(column.cameraName), kandangId, }; } export function normalizeFeedSackColumnConfigs( columns: FeedSackColumnConfig[] ): FeedSackColumnConfig[] { return columns.map(normalizeFeedSackColumnConfig); } export function getUsageCameraNamesForKandang( columns: FeedSackColumnConfig[], kandangId?: number | null, kandangName?: string | null ): string[] { const usageColumns = columns.filter((column) => column.type === 'usage'); if (kandangId !== null && kandangId !== undefined) { const mappedCameras = usageColumns .filter((column) => column.kandangId === kandangId) .map((column) => column.cameraName); if (mappedCameras.length > 0) { return mappedCameras; } const inferredCameras = usageColumns .filter((column) => inferKandangIdFromCameraName(column.cameraName) === kandangId) .map((column) => column.cameraName); if (inferredCameras.length > 0) { return inferredCameras; } } if (kandangName) { const kandangNameLower = kandangName.toLowerCase(); const kandangPrefix = kandangNameLower.replace(/\s+/g, '_'); if (kandangNameLower.includes('atas')) { const atasCameras = usageColumns .filter( (column) => column.cameraName.toLowerCase().includes('atas') || column.cameraName.toLowerCase().includes('kiri') ) .map((column) => column.cameraName); if (atasCameras.length > 0) { return atasCameras; } } if (kandangNameLower.includes('bawah')) { const bawahCameras = usageColumns .filter( (column) => column.cameraName.toLowerCase().includes('bawah') || column.cameraName.toLowerCase().includes('kanan') ) .map((column) => column.cameraName); if (bawahCameras.length > 0) { return bawahCameras; } } const prefixedCameras = usageColumns .filter((column) => column.cameraName.toLowerCase().startsWith(kandangPrefix)) .map((column) => column.cameraName); if (prefixedCameras.length > 0) { return prefixedCameras; } } return usageColumns.map((column) => column.cameraName); }