import 'package:flutter/material.dart'; import '../../widgets/color.dart'; class DetailKopiScreen extends StatelessWidget { // Constructor dikosongkan karena data diambil dari ModalRoute arguments const DetailKopiScreen({super.key}); @override Widget build(BuildContext context) { // MENGAMBIL DATA DARI NAVIGASI final args = ModalRoute.of(context)!.settings.arguments as Map; final String title = args['title'] ?? 'Detail Kopi'; // final String imagePath = args['imagePath'] ?? ''; final bool isArabika = title.contains("Arabika"); final String level = title.split(" ").last; return Scaffold( backgroundColor: AppColors.background, body: CustomScrollView( physics: const BouncingScrollPhysics(), slivers: [ // HEADER DENGAN GAMBAR ROASTING (.JPG) SliverAppBar( expandedHeight: 350, pinned: true, stretch: true, backgroundColor: AppColors.brownMain, leading: Padding( padding: const EdgeInsets.all(8.0), child: CircleAvatar( backgroundColor: Colors.black.withOpacity(0.3), child: IconButton( icon: const Icon( Icons.arrow_back_ios_new, size: 18, color: Colors.white, ), onPressed: () => Navigator.pop(context), ), ), ), flexibleSpace: FlexibleSpaceBar( stretchModes: const [StretchMode.zoomBackground], background: Stack( fit: StackFit.expand, children: [ Image.asset( 'assets/images/roasting.jpg', fit: BoxFit.cover, errorBuilder: (c, e, s) => Container(color: AppColors.heroCokelat), ), const DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [Colors.transparent, Colors.black54], ), ), ), Positioned( bottom: 40, left: 20, right: 20, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildBadge(isArabika ? "Arabika" : "Robusta"), const SizedBox(height: 10), Text( title, style: TextStyle( fontFamily: 'Montserrat', fontSize: 28, fontWeight: FontWeight.w700, color: Colors.white, shadows: [ Shadow(blurRadius: 10, color: Colors.black), ], ), ), ], ), ), ], ), ), ), // KONTEN UTAMA SliverToBoxAdapter( child: Container( transform: Matrix4.translationValues(0, -20, 0), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), decoration: const BoxDecoration( color: AppColors.background, borderRadius: BorderRadius.only( topLeft: Radius.circular(30), topRight: Radius.circular(30), ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // STATS CARD (SUHU, RASA, CRACK) _buildQuickStats(level), const SizedBox(height: 35), _buildSectionTitle(Icons.info_outline, "Mengenal Kopi"), _buildParagraph( "Kopi merupakan salah satu produk perdagangan dalam sektor pertanian yang memiliki potensi untuk meningkatkan pendapatan negara serta keuntungan bagi para petani dan pengusaha. Keberadaan kopi di Indonesia dimulai pada tahun 1960-an. Kopi termasuk dalam keluarga Rubiaceae dari genus Coffea. Jenis kopi yang dominan ditanam di Indonesia adalah kopi robusta dan arabika.", ), const SizedBox(height: 25), _buildSectionTitle( Icons.grain, "Karakteristik ${isArabika ? 'Arabika' : 'Robusta'}", ), _buildParagraph( isArabika ? "Kopi Arabika dikenal sebagai jenis kopi dengan cita rasa yang unggul dan kandungan kafein yang lebih rendah dibandingkan kopi Robusta. Aroma dari kopi arabika cenderung memiliki rasa yang lebih asam dan menyerupai citrus serta buah-buahan." : "Kopi Robusta merupakan varietas yang paling banyak dibudidayakan di Indonesia. Biji kopi robusta memberikan aroma yang mirip dengan kacang sebelum mengalami proses sangrai. Kualitasnya sangat dipengaruhi oleh metode pengolahan dan lokasi penanaman.", ), const SizedBox(height: 30), _buildSectionTitle( Icons.local_fire_department, "Profil Roasting $level", ), const SizedBox(height: 12), _buildHighlightBox(_getRoastingFullDescription(level)), const SizedBox(height: 50), ], ), ), ), ], ), ); } // --- WIDGET HELPER --- Widget _buildBadge(String label) { return Container( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 6), decoration: BoxDecoration( color: AppColors.greenMain, borderRadius: BorderRadius.circular(10), ), child: Text( label.toUpperCase(), style: TextStyle( fontFamily: 'Montserrat', color: Colors.white, fontWeight: FontWeight.w700, fontSize: 10, ), ), ); } Widget _buildQuickStats(String level) { String temp; String rasa; String crack; if (level == "Light") { temp = "180-205°C"; rasa = "Asam Tinggi"; crack = "1st Crack"; } else if (level == "Medium") { temp = "210-220°C"; rasa = "Seimbang"; crack = "1st Crack"; } else { temp = "240°C"; rasa = "Pahit Tinggi"; crack = "2nd Crack"; } return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 15), ], ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _statItem(Icons.thermostat_rounded, "Suhu", temp), _statDivider(), _statItem(Icons.opacity_rounded, "Rasa", rasa), _statDivider(), _statItem(Icons.timer_rounded, "Crack", crack), ], ), ); } Widget _statItem(IconData icon, String label, String value) { return Column( children: [ Icon(icon, color: AppColors.brownMain, size: 24), const SizedBox(height: 8), Text( label, style: TextStyle( fontFamily: 'Montserrat', fontSize: 10, color: Colors.grey, ), ), Text( value, style: TextStyle( fontFamily: 'Montserrat', fontSize: 11, fontWeight: FontWeight.w700, color: AppColors.textDark, ), ), ], ); } Widget _statDivider() => Container(height: 30, width: 1, color: Colors.black12); Widget _buildSectionTitle(IconData icon, String title) { return Padding( padding: const EdgeInsets.only(bottom: 12), child: Row( children: [ Icon(icon, color: AppColors.brownMain, size: 20), const SizedBox(width: 8), Text( title, style: TextStyle( fontFamily: 'Montserrat', fontSize: 18, fontWeight: FontWeight.w700, color: AppColors.textDark, ), ), ], ), ); } Widget _buildParagraph(String text) { return Text( text, textAlign: TextAlign.justify, style: TextStyle( fontFamily: 'Montserrat', fontSize: 14, color: Colors.black54, height: 1.7, ), ); } Widget _buildHighlightBox(String text) { return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: AppColors.brownMain.withOpacity(0.05), borderRadius: BorderRadius.circular(20), border: Border.all(color: AppColors.brownMain.withOpacity(0.1)), ), child: Text( text, textAlign: TextAlign.justify, style: TextStyle( fontFamily: 'Montserrat', fontSize: 14, color: AppColors.textDark, height: 1.8, fontWeight: FontWeight.w500, ), ), ); } String _getRoastingFullDescription(String level) { if (level == "Light") { return "Tahap roasting dengan tingkat kematangan paling rendah. Kopi menghasilkan cita rasa asam yang dominan, warna cokelat terang, serta tekstur biji kering. Suhu berada pada kisaran 180°C - 205°C, diakhiri dengan terjadinya first crack. Memiliki kandungan kafein dan keasaman (acidity) sangat tinggi."; } else if (level == "Medium") { return "Level yang paling populer karena menghasilkan cita rasa manis dengan aroma kuat dan harum. Biji berwarna lebih gelap dan mulai tampak berminyak seiring proses karbonisasi gula. Suhu berada pada kisaran 210°C - 220°C, setelah melewati first crack namun belum mencapai second crack."; } else { return "Tahap kematangan paling tinggi, ditandai warna biji sangat gelap dan berminyak. Profil rasa dominan pahit (bitterness) serta mengurangi karakteristik asli biji kopi. Suhu mencapai kisaran 240°C setelah menyelesaikan second crack. Memiliki karakter body yang lebih kental."; } } }