package com.aistudio.bonjuteri.jwlry.ui.screens import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.DeleteOutline import androidx.compose.material.icons.filled.Remove import androidx.compose.material.icons.filled.ShoppingCart import androidx.compose.material.icons.outlined.Diamond import androidx.compose.material.icons.outlined.LocalShipping import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.DividerDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import coil.request.ImageRequest import com.aistudio.bonjuteri.jwlry.data.CartRepository import com.aistudio.bonjuteri.jwlry.model.CartItem import com.aistudio.bonjuteri.jwlry.model.Product import com.aistudio.bonjuteri.jwlry.ui.components.EmptyStateView import com.aistudio.bonjuteri.jwlry.ui.theme.ErrorRed import com.aistudio.bonjuteri.jwlry.ui.theme.GoldPrimary import com.aistudio.bonjuteri.jwlry.ui.theme.GoldSubtle import com.aistudio.bonjuteri.jwlry.ui.theme.LightSurface import com.aistudio.bonjuteri.jwlry.ui.theme.MutedGrey import com.aistudio.bonjuteri.jwlry.ui.theme.OffWhite import com.aistudio.bonjuteri.jwlry.ui.theme.PrimaryBlack import com.aistudio.bonjuteri.jwlry.ui.theme.PureWhite import com.aistudio.bonjuteri.jwlry.ui.theme.SuccessGreen import com.aistudio.bonjuteri.jwlry.ui.theme.SurfaceBorder @Composable fun CartScreen( cartItems: List, onUpdateQuantity: (String, Long) -> Unit, onRemoveItem: (String) -> Unit, onCheckoutClick: () -> Unit, onStartShoppingClick: () -> Unit, modifier: Modifier = Modifier ) { val subtotal = cartItems.sumOf { it.totalPrice } val isFreeShipping = subtotal >= CartRepository.FREE_SHIPPING_THRESHOLD val shippingCost = if (isFreeShipping) 0.0 else CartRepository.STANDARD_SHIPPING_COST val totalAmount = subtotal + shippingCost val remainingForFreeShipping = (CartRepository.FREE_SHIPPING_THRESHOLD - subtotal).coerceAtLeast(0.0) if (cartItems.isEmpty()) { EmptyStateView( icon = Icons.Filled.ShoppingCart, title = "Sepetiniz Boş", description = "Henüz sepetinize bir ürün eklemediniz. BONJUTERİ'nin benzersiz koleksiyonlarını keşfedin!", actionButtonText = "Alışverişe Başla", onActionClick = onStartShoppingClick, modifier = modifier.fillMaxSize() ) return } Column( modifier = modifier .fillMaxSize() .background(OffWhite) ) { // Free shipping banner Surface( color = if (isFreeShipping) GoldSubtle else PureWhite, modifier = Modifier.fillMaxWidth(), shadowElevation = 1.dp ) { Column(modifier = Modifier.padding(14.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( imageVector = Icons.Outlined.LocalShipping, contentDescription = null, tint = if (isFreeShipping) SuccessGreen else GoldPrimary, modifier = Modifier.size(20.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text( text = if (isFreeShipping) "Tebrikler! Kargo ÜCRETSİZ!" else "Kargonun ÜCRETSİZ olması için ${Product.formatCurrency(remainingForFreeShipping)} daha ekleyin!", style = MaterialTheme.typography.bodySmall.copy( fontWeight = FontWeight.Bold, color = if (isFreeShipping) SuccessGreen else PrimaryBlack ) ) } Spacer(modifier = Modifier.height(6.dp)) LinearProgressIndicator( progress = { (subtotal / CartRepository.FREE_SHIPPING_THRESHOLD).toFloat().coerceIn(0f, 1f) }, modifier = Modifier .fillMaxWidth() .height(6.dp) .clip(RoundedCornerShape(3.dp)), color = GoldPrimary, trackColor = SurfaceBorder ) } } // Cart items list LazyColumn( modifier = Modifier .weight(1f) .padding(horizontal = 14.dp, vertical = 8.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { items(cartItems, key = { it.id }) { item -> Card( modifier = Modifier .fillMaxWidth() .testTag("cart_item_${item.productId}"), colors = CardDefaults.cardColors(containerColor = PureWhite), shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp) ) { Row( modifier = Modifier .fillMaxWidth() .padding(12.dp), verticalAlignment = Alignment.CenterVertically ) { // Image Box( modifier = Modifier .size(74.dp) .clip(RoundedCornerShape(8.dp)) .background(LightSurface), contentAlignment = Alignment.Center ) { if (item.imageUrl.isNotBlank()) { AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data(item.imageUrl) .crossfade(true) .build(), contentDescription = item.title, modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop ) } else { Icon(Icons.Outlined.Diamond, contentDescription = null, tint = GoldPrimary) } } Spacer(modifier = Modifier.width(12.dp)) // Details Column(modifier = Modifier.weight(1f)) { Text( text = item.title, style = MaterialTheme.typography.titleSmall.copy( fontWeight = FontWeight.Bold, color = PrimaryBlack, fontSize = 14.sp ), maxLines = 2, overflow = TextOverflow.Ellipsis ) Spacer(modifier = Modifier.height(4.dp)) Text( text = item.formattedTotalPrice, style = MaterialTheme.typography.titleMedium.copy( fontWeight = FontWeight.Black, color = PrimaryBlack ) ) Spacer(modifier = Modifier.height(8.dp)) // Quantity controls Row(verticalAlignment = Alignment.CenterVertically) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .border(1.dp, SurfaceBorder, RoundedCornerShape(6.dp)) .padding(horizontal = 2.dp, vertical = 1.dp) ) { IconButton( onClick = { onUpdateQuantity(item.productId, item.quantity - 1) }, modifier = Modifier.size(28.dp) ) { Icon( imageVector = Icons.Filled.Remove, contentDescription = "Azalt", modifier = Modifier.size(14.dp) ) } Text( text = item.quantity.toString(), fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.padding(horizontal = 8.dp) ) IconButton( onClick = { if (item.quantity < item.maxStock) { onUpdateQuantity(item.productId, item.quantity + 1) } }, enabled = item.quantity < item.maxStock, modifier = Modifier.size(28.dp) ) { Icon( imageVector = Icons.Filled.Add, contentDescription = "Artır", modifier = Modifier.size(14.dp) ) } } Spacer(modifier = Modifier.weight(1f)) IconButton( onClick = { onRemoveItem(item.productId) }, modifier = Modifier.size(32.dp) ) { Icon( imageVector = Icons.Filled.DeleteOutline, contentDescription = "Sil", tint = ErrorRed, modifier = Modifier.size(18.dp) ) } } } } } } } // Summary and Checkout Bottom Bar Surface( color = PureWhite, shadowElevation = 8.dp, modifier = Modifier.fillMaxWidth() ) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Text("Ara Toplam", color = MutedGrey, fontSize = 13.sp) Text(Product.formatCurrency(subtotal), fontWeight = FontWeight.SemiBold, fontSize = 13.sp) } Spacer(modifier = Modifier.height(4.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Text("Kargo Ücreti", color = MutedGrey, fontSize = 13.sp) Text( text = if (isFreeShipping) "ÜCRETSİZ" else Product.formatCurrency(shippingCost), fontWeight = FontWeight.SemiBold, color = if (isFreeShipping) SuccessGreen else PrimaryBlack, fontSize = 13.sp ) } HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp), color = DividerDefaults.color) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Column { Text("Genel Toplam", color = MutedGrey, fontSize = 11.sp) Text( text = Product.formatCurrency(totalAmount), style = MaterialTheme.typography.titleLarge.copy( fontWeight = FontWeight.Black, fontSize = 18.sp, color = PrimaryBlack ) ) } Button( onClick = onCheckoutClick, modifier = Modifier .height(48.dp) .testTag("checkout_button"), shape = RoundedCornerShape(10.dp), colors = ButtonDefaults.buttonColors( containerColor = PrimaryBlack, contentColor = PureWhite ) ) { Text( text = "Siparişi Tamamla", fontWeight = FontWeight.Bold, fontSize = 14.sp ) } } } } } }