import { useState, useEffect } from 'react'; import { BarChart3, TrendingUp, Users, Leaf } from 'lucide-react'; import { analyticsApi, YieldAnalytics, TaskAnalytics } from '../lib/analyticsApi'; import { PageHeader, EmptyState, MetricCard, CardSkeleton } from '../components/ui/LinearPrimitives'; export default function ReportsPage() { const [yieldData, setYieldData] = useState(null); const [taskData, setTaskData] = useState(null); const [activeTab, setActiveTab] = useState<'yield' | 'tasks'>('yield'); const [loading, setLoading] = useState(true); useEffect(() => { Promise.all([ analyticsApi.getYield(), analyticsApi.getTasks() ]).then(([yield_, tasks]) => { setYieldData(yield_); setTaskData(tasks); }).catch(console.error).finally(() => setLoading(false)); }, []); return (
{/* Tab Selector */}
{loading ? (
{Array.from({ length: 4 }).map((_, i) => )}
) : ( <> {activeTab === 'yield' && yieldData && (
{/* Strain Performance */}

Strain Performance

Average yield per plant by strain

{yieldData.byStrain.length === 0 ? (

No yield data recorded yet. Log weight during harvest stages.

) : (
{yieldData.byStrain.sort((a, b) => b.avgGramsPerPlant - a.avgGramsPerPlant).map((strain, i) => (
{i + 1}
{strain.strain} {strain.avgGramsPerPlant}g / plant

{strain.batchCount} batch{strain.batchCount > 1 ? 'es' : ''} · {strain.totalGrams.toLocaleString()}g total · {strain.totalPlants} plants

))}
)}
{/* Batch Yields Table */}

Batch Yields

{yieldData.byBatch.length === 0 ? ( ) : ( yieldData.byBatch.map(batch => ( )) )}
Batch Strain Plants Total g/Plant
No batch yield data available.
{batch.batchName} {batch.strain} {batch.plantCount} {batch.totalGrams.toLocaleString()}g {batch.gramsPerPlant}g
)} {activeTab === 'tasks' && taskData && (
{/* Task Summary Cards */}
{/* Completion Rate */}

Completion Rate

0 ? (taskData.summary.completed / taskData.summary.total * 100) : 0}%` }} />

{taskData.summary.total > 0 ? `${Math.round(taskData.summary.completed / taskData.summary.total * 100)}% complete` : 'No tasks created yet'}

{/* Staff Leaderboard */}

Staff Leaderboard (This Week)

{taskData.completedByUserThisWeek.length === 0 ? (

No tasks completed this week.

) : (
{taskData.completedByUserThisWeek.sort((a, b) => b.completedCount - a.completedCount).map((user, i) => (
{i + 1}
{user.userName}
{user.completedCount} tasks
))}
)}
)} )}
); }