import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/kandang_provider.dart'; import '../providers/panen_provider.dart'; import '../providers/penjadwalan_provider.dart'; class DashboardPage extends StatelessWidget { const DashboardPage({super.key}); @override Widget build(BuildContext context) { final kandangProvider = context.watch(); return Scaffold( body: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.orange.shade100, Colors.amber.shade100, Colors.greenAccent.shade100, ], ), ), child: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Header Text( 'Dashboard', style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold, color: Colors.orange.shade700, ), ), const SizedBox(height: 8), Text( 'Ringkasan produksi telur hari ini', style: TextStyle(fontSize: 14, color: Colors.grey.shade600), ), const SizedBox(height: 30), // Total Telur Keseluruhan Container( decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.orange.shade300, Colors.orange.shade600], ), borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.orange.shade300.withOpacity(0.3), blurRadius: 10, offset: const Offset(0, 5), ), ], ), padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Total Telur Hari Ini', style: TextStyle( fontSize: 16, color: Colors.white.withOpacity(0.9), fontWeight: FontWeight.w500, ), ), const SizedBox(height: 12), Row( children: [ Text( '${kandangProvider.infra1Value + kandangProvider.infra2Value}', style: const TextStyle( fontSize: 48, fontWeight: FontWeight.bold, color: Colors.white, ), ), const SizedBox(width: 12), Text('🥚', style: TextStyle(fontSize: 40)), ], ), ], ), ), const SizedBox(height: 30), // Jadwal Panen Hari Ini Consumer( builder: (context, penjadwalanProvider, _) { final jadwals = penjadwalanProvider.penjadwalans .where((j) => j.aktif) .toList(); return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 5), ), ], ), padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Jadwal Panen Hari Ini', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey.shade800, ), ), const SizedBox(height: 12), if (jadwals.isEmpty) Center( child: Text( 'Tidak ada jadwal panen hari ini', style: TextStyle(color: Colors.grey.shade600), ), ) else ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: jadwals.length, itemBuilder: (context, idx) { final jadwal = jadwals[idx]; return Container( margin: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.amber.shade50, borderRadius: BorderRadius.circular(12), border: Border.all( color: Colors.orange.shade200, ), ), child: Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.orange.shade100, borderRadius: BorderRadius.circular( 8, ), ), child: Icon( Icons.schedule, color: Colors.orange.shade600, size: 20, ), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Text( jadwal.jam, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.bold, ), ), const SizedBox(width: 8), Text( '(${jadwal.durasi})', style: TextStyle( fontSize: 11, color: Colors.orange.shade600, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 4), Text( jadwal.keterangan, style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), ), ], ), ), Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 6, ), decoration: BoxDecoration( color: Colors.green.shade100, borderRadius: BorderRadius.circular( 20, ), ), child: Text( 'Aktif', style: TextStyle( fontSize: 12, color: Colors.green.shade700, fontWeight: FontWeight.bold, ), ), ), ], ), ); }, ), ], ), ); }, ), const SizedBox(height: 30), // Status Panen Terakhir Consumer( builder: (context, panenProvider, _) { return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 5), ), ], ), padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Status Panen Terakhir', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey.shade800, ), ), const SizedBox(height: 16), ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: kandangProvider.kandangs.length, itemBuilder: (context, idx) { final kandang = kandangProvider.kandangs[idx]; final lastHarvest = panenProvider .getLastHarvestStatus(kandang.id); if (lastHarvest == null) { return Container( margin: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.grey.shade50, borderRadius: BorderRadius.circular(12), border: Border.all( color: Colors.grey.shade200, ), ), child: Row( children: [ Icon( Icons.info, color: Colors.grey.shade400, size: 20, ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( kandang.nama, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 2), Text( 'Belum ada riwayat panen', style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), ), ], ), ), ], ), ); } return Container( margin: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.green.shade50, borderRadius: BorderRadius.circular(12), border: Border.all( color: Colors.green.shade200, ), ), child: Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.green.shade100, borderRadius: BorderRadius.circular(8), ), child: Icon( Icons.check_circle, color: Colors.green.shade600, size: 20, ), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Text( kandang.nama, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.bold, ), ), const SizedBox(width: 8), Text( '(${lastHarvest.jenisPanen?.toUpperCase() ?? 'MANUAL'})', style: TextStyle( fontSize: 11, color: Colors.green.shade600, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 2), Text( '${lastHarvest.jumlahTelur} telur @${lastHarvest.jam}', style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), ), ], ), ), Text( '${lastHarvest.tanggalPanen.day}/${lastHarvest.tanggalPanen.month}', style: TextStyle( fontSize: 12, color: Colors.grey.shade500, ), ), ], ), ); }, ), ], ), ); }, ), const SizedBox(height: 30), // Daftar Kandang Text( 'Status Kandang', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.grey.shade800, ), ), const SizedBox(height: 16), ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: kandangProvider.kandangs.length, itemBuilder: (context, index) { final kandang = kandangProvider.kandangs[index]; // Ambil telur dari sensor berdasarkan index // Index 0 → infra1Value, Index 1 → infra2Value, dst int telurCount = 0; if (index == 0) { telurCount = kandangProvider.infra1Value; } else if (index == 1) { telurCount = kandangProvider.infra2Value; } // Bisa di-extend untuk infra3, infra4, dll jika diperlukan return Container( margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 5), ), ], ), child: Padding( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( kandang.nama, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), Text( '${kandang.jumlahAyam} ekor ayam', style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), ), ], ), Container( decoration: BoxDecoration( color: Colors.orange.shade100, borderRadius: BorderRadius.circular(12), ), padding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), child: Column( children: [ Text( telurCount.toString(), style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.orange.shade700, ), ), Text( 'Telur', style: TextStyle( fontSize: 10, color: Colors.orange.shade600, ), ), ], ), ), ], ), ], ), ), ); }, ), ], ), ), ), ), ); } }