import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:cached_network_image/cached_network_image.dart'; import '../providers/cart_provider.dart'; import '../services/coupon_service.dart'; import '../models/coupon.dart'; import 'product_detail_screen.dart'; import 'checkout_screen.dart'; class _CartScreenState extends State { final CouponService _couponService = CouponService(); final TextEditingController _couponController = TextEditingController(); Coupon? _appliedCoupon; bool _isValidatingCoupon = false; @override void dispose() { _couponController.dispose(); super.dispose(); } Future _applyCoupon() async { if (_couponController.text.trim().isEmpty) return; setState(() { _isValidatingCoupon = true; }); final coupon = await _couponService.validateCoupon(_couponController.text.trim()); setState(() { _appliedCoupon = coupon.isValid ? coupon : null; _isValidatingCoupon = false; }); if (!coupon.isValid) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(coupon.errorMessage ?? 'Ungültiger Gutschein-Code'), backgroundColor: Colors.red, ), ); } } } void _removeCoupon() { setState(() { _appliedCoupon = null; _couponController.clear(); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Warenkorb'), ), body: Consumer( builder: (context, cart, child) { if (cart.items.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.shopping_cart_outlined, size: 64, color: Colors.grey[400], ), const SizedBox(height: 16), Text( 'Dein Warenkorb ist leer', style: Theme.of(context).textTheme.titleLarge?.copyWith( color: Colors.grey[600], ), ), const SizedBox(height: 8), Text( 'Füge Produkte hinzu, um zu beginnen', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.grey[500], ), ), ], ), ); } return Column( children: [ Expanded( child: ListView.builder( padding: const EdgeInsets.all(16), itemCount: cart.items.length, itemBuilder: (context, index) { final item = cart.items[index]; return Card( margin: const EdgeInsets.only(bottom: 12), child: InkWell( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ProductDetailScreen( product: item.product, ), ), ); }, child: Padding( padding: const EdgeInsets.all(12), child: Row( children: [ // Produktbild if (item.product.imageUrl != null) ClipRRect( borderRadius: BorderRadius.circular(8), child: CachedNetworkImage( imageUrl: item.product.imageUrl!, width: 80, height: 80, fit: BoxFit.cover, placeholder: (context, url) => Container( width: 80, height: 80, color: Colors.grey[300], child: const Center( child: CircularProgressIndicator(), ), ), errorWidget: (context, url, error) => Container( width: 80, height: 80, color: Colors.grey[300], child: const Icon(Icons.image_not_supported), ), ), ) else Container( width: 80, height: 80, color: Colors.grey[300], child: const Icon(Icons.image_not_supported), ), const SizedBox(width: 12), // Produktinfo Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( item.product.name, style: Theme.of(context) .textTheme .titleMedium ?.copyWith( fontWeight: FontWeight.bold, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 4), Text( '${item.product.price} €', style: Theme.of(context) .textTheme .bodyLarge ?.copyWith( color: const Color(0xFF8B6F47), fontWeight: FontWeight.bold, ), ), ], ), ), // Mengensteuerung Column( children: [ Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: const Icon(Icons.remove_circle_outline), onPressed: () => cart.removeItem(item.product), ), Text( '${item.quantity}', style: Theme.of(context).textTheme.titleMedium, ), IconButton( icon: const Icon(Icons.add_circle_outline), onPressed: () => cart.addItem(item.product), ), ], ), Text( '${item.totalPrice.toStringAsFixed(2)} €', style: Theme.of(context) .textTheme .bodyMedium ?.copyWith( fontWeight: FontWeight.bold, ), ), ], ), // Entfernen IconButton( icon: const Icon(Icons.delete_outline), color: Colors.red, onPressed: () { cart.removeItemCompletely(item.product); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('${item.product.name} entfernt'), ), ); }, ), ], ), ), ), ); }, ), ), // Gesamtsumme und Checkout Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 4, offset: const Offset(0, -2), ), ], ), child: Column( children: [ // Gutschein-Eingabe Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.grey[100], borderRadius: BorderRadius.circular(8), ), child: Row( children: [ Expanded( child: TextField( controller: _couponController, decoration: InputDecoration( hintText: 'Gutschein-Code', border: InputBorder.none, isDense: true, ), enabled: !_isValidatingCoupon && _appliedCoupon == null, ), ), if (_appliedCoupon != null) IconButton( icon: const Icon(Icons.check_circle, color: Colors.green), onPressed: _removeCoupon, ) else IconButton( icon: _isValidatingCoupon ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Icon(Icons.add), onPressed: _isValidatingCoupon ? null : _applyCoupon, ), ], ), ), if (_appliedCoupon != null) ...[ const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Rabatt (${_appliedCoupon!.code}):', style: Theme.of(context).textTheme.bodyMedium, ), Text( '-${_couponService.calculateDiscount(_appliedCoupon!, cart.totalPrice).toStringAsFixed(2)} €', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.green, fontWeight: FontWeight.bold, ), ), ], ), ], const SizedBox(height: 12), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Gesamtsumme:', style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, ), ), Text( '${(cart.totalPrice - (_appliedCoupon != null ? _couponService.calculateDiscount(_appliedCoupon!, cart.totalPrice) : 0)).toStringAsFixed(2)} €', style: Theme.of(context).textTheme.headlineSmall?.copyWith( color: const Color(0xFF8B6F47), fontWeight: FontWeight.bold, ), ), ], ), const SizedBox(height: 16), SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const CheckoutScreen(), ), ); }, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF8B6F47), foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: const Text( 'Zur Kasse', style: TextStyle(fontSize: 16), ), ), ), ], ), ), ], ); }, ), ); } } class CartScreen extends StatefulWidget { const CartScreen({super.key}); @override State createState() => _CartScreenState(); }