import React, { useMemo, useEffect, useState } from 'react';
import { LiveCount } from '../../types.ts';
import { CalculatorIcon } from '../icons/Icons.tsx';
import { useAppContext } from '../../context/AppContext.tsx';
import { apiClient } from '../../services/apiService.ts';
import { formatNumber } from '../../utils/formatters.ts';
const StatItem: React.FC<{
icon: React.ReactNode;
label: string;
value: string;
valueColor?: string;
}> = ({ icon, label, value, valueColor = 'text-gray-900' }) => (
);
interface CountingStatsProps {
liveCounts: LiveCount[];
kandangId?: number | null;
initialPop?: number;
}
const CountingStats: React.FC = ({ liveCounts, kandangId, initialPop }) => {
const { cycleData, apiMode } = useAppContext();
const [currentPopulation, setCurrentPopulation] = useState(null);
// Fetch current population from mortality data
useEffect(() => {
const fetchPopulation = async () => {
try {
const dbRecords = await apiClient.getMortalityRecords(cycleData.id, kandangId ?? undefined);
const initPop = initialPop ?? cycleData.docInCount ?? 20000;
// Calculate total mortality
const totalMortality = dbRecords.reduce(
(sum: number, record: { mortalityCount?: number; afkir?: number }) =>
sum + (record.mortalityCount || 0) + (record.afkir || 0),
0
);
const population = initPop - totalMortality;
setCurrentPopulation(population);
} catch (error) {
console.error('Failed to fetch population:', error);
setCurrentPopulation(null);
}
};
if (apiMode === 'LIVE') {
fetchPopulation();
}
}, [cycleData, apiMode, kandangId, initialPop]);
const { totalCount, activeCameras } = useMemo(() => {
const onlineCams = liveCounts.filter((cam) => cam.status === 'online');
const total = onlineCams.reduce((sum, cam) => sum + cam.count, 0);
return {
totalCount: total,
activeCameras: onlineCams.length,
};
}, [liveCounts]);
const totalCameras = liveCounts.length;
// In LIVE mode, use real population data and show N/A for unimplemented features
const displayTotalCount =
apiMode === 'LIVE' && currentPopulation !== null
? formatNumber(currentPopulation)
: apiMode === 'DEMO'
? formatNumber(totalCount)
: 'N/A';
const displayCameras = apiMode === 'DEMO' ? `${activeCameras} / ${totalCameras}` : 'N/A';
const displayAccuracy = apiMode === 'DEMO' ? '98.2%' : 'N/A';
const displayLastUpdate = apiMode === 'DEMO' ? 'Baru saja' : 'N/A';
return (
Statistik Agregat
}
label="Total Populasi Terhitung"
value={`${displayTotalCount} ekor`}
valueColor={apiMode === 'LIVE' ? 'text-red-600' : 'text-red-600'}
/>
}
label="Kamera Aktif (Menghitung)"
value={displayCameras}
valueColor={
apiMode === 'DEMO' && activeCameras === totalCameras
? 'text-green-600'
: 'text-gray-500'
}
/>
}
label="Akurasi Model AI (Avg)"
value={displayAccuracy}
valueColor={apiMode === 'DEMO' ? 'text-green-600' : 'text-gray-500'}
/>
}
label="Pembaruan Terakhir"
value={displayLastUpdate}
valueColor="text-gray-500"
/>
);
};
export default CountingStats;