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.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio 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.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.AddShoppingCart import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.FavoriteBorder import androidx.compose.material.icons.filled.Remove import androidx.compose.material.icons.outlined.CheckCircle import androidx.compose.material.icons.outlined.Diamond import androidx.compose.material.icons.outlined.LocalShipping import androidx.compose.material.icons.outlined.Security import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color 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.TextDecoration 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.model.Product import com.aistudio.bonjuteri.jwlry.ui.theme.BadgeBestSellerBg import com.aistudio.bonjuteri.jwlry.ui.theme.BadgeDiscountBg import com.aistudio.bonjuteri.jwlry.ui.theme.BadgeDiscountText import com.aistudio.bonjuteri.jwlry.ui.theme.BadgeNewBg 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 import com.aistudio.bonjuteri.jwlry.ui.theme.WarningAmber import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable fun ProductDetailScreen( product: Product, isFavorite: Boolean, onBackClick: () -> Unit, onFavoriteToggle: () -> Unit, onAddToCart: (Long) -> Unit, snackbarHostState: SnackbarHostState, modifier: Modifier = Modifier ) { var quantity by remember { mutableLongStateOf(1L) } val scope = rememberCoroutineScope() Scaffold( topBar = { TopAppBar( title = { Text(text = product.category, style = MaterialTheme.typography.titleMedium) }, navigationIcon = { IconButton(onClick = onBackClick) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Geri" ) } }, actions = { IconButton(onClick = onFavoriteToggle) { Icon( imageVector = if (isFavorite) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder, contentDescription = "Favoriye Ekle", tint = if (isFavorite) ErrorRed else PrimaryBlack ) } }, colors = TopAppBarDefaults.topAppBarColors(containerColor = PureWhite) ) }, bottomBar = { Surface( color = PureWhite, shadowElevation = 8.dp, modifier = Modifier.fillMaxWidth() ) { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically ) { // Quantity selector if (product.isInStock) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .border(1.dp, SurfaceBorder, RoundedCornerShape(8.dp)) .padding(horizontal = 4.dp, vertical = 2.dp) ) { IconButton( onClick = { if (quantity > 1) quantity-- }, enabled = quantity > 1, modifier = Modifier.size(32.dp) ) { Icon(Icons.Filled.Remove, contentDescription = "Azalt", modifier = Modifier.size(16.dp)) } Text( text = quantity.toString(), fontWeight = FontWeight.Bold, modifier = Modifier.padding(horizontal = 8.dp) ) IconButton( onClick = { if (quantity < product.stock) quantity++ }, enabled = quantity < product.stock, modifier = Modifier.size(32.dp) ) { Icon(Icons.Filled.Add, contentDescription = "Artır", modifier = Modifier.size(16.dp)) } } } Spacer(modifier = Modifier.width(12.dp)) Button( onClick = { onAddToCart(quantity) scope.launch { snackbarHostState.showSnackbar("$quantity adet ${product.title} sepete eklendi!") } }, enabled = product.isInStock, modifier = Modifier .weight(1f) .height(48.dp) .testTag("detail_add_to_cart_btn"), shape = RoundedCornerShape(10.dp), colors = ButtonDefaults.buttonColors( containerColor = PrimaryBlack, contentColor = PureWhite ) ) { Icon( imageVector = Icons.Filled.AddShoppingCart, contentDescription = null, modifier = Modifier.size(18.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text( text = if (product.isInStock) "Sepete Ekle (${Product.formatCurrency(product.price * quantity)})" else "Tükendi", fontWeight = FontWeight.Bold, fontSize = 14.sp ) } } } } ) { padding -> Column( modifier = modifier .fillMaxSize() .padding(padding) .background(PureWhite) .verticalScroll(rememberScrollState()) ) { // Product Hero Image Box( modifier = Modifier .fillMaxWidth() .aspectRatio(1f) .background(LightSurface) ) { if (product.imageUrl.isNotBlank()) { AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data(product.imageUrl) .crossfade(true) .build(), contentDescription = product.title, modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop ) } else { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Icon( imageVector = Icons.Outlined.Diamond, contentDescription = null, tint = GoldPrimary, modifier = Modifier.size(72.dp) ) } } } Column(modifier = Modifier.padding(16.dp)) { // Badges FlowRow( horizontalArrangement = Arrangement.spacedBy(6.dp), verticalArrangement = Arrangement.spacedBy(4.dp) ) { if (product.isNew) { Box( modifier = Modifier .background(BadgeNewBg, RoundedCornerShape(4.dp)) .padding(horizontal = 8.dp, vertical = 3.dp) ) { Text("YENİ", color = PureWhite, fontSize = 10.sp, fontWeight = FontWeight.Bold) } } if (product.isBestSeller) { Box( modifier = Modifier .background(BadgeBestSellerBg, RoundedCornerShape(4.dp)) .padding(horizontal = 8.dp, vertical = 3.dp) ) { Text("ÇOK SATAN", color = PureWhite, fontSize = 10.sp, fontWeight = FontWeight.Bold) } } if (product.hasDiscount) { Box( modifier = Modifier .background(BadgeDiscountBg, RoundedCornerShape(4.dp)) .padding(horizontal = 8.dp, vertical = 3.dp) ) { Text( "%${product.discountPercent} İNDİRİM", color = BadgeDiscountText, fontSize = 10.sp, fontWeight = FontWeight.Bold ) } } } Spacer(modifier = Modifier.height(10.dp)) // Product Title Text( text = product.title, style = MaterialTheme.typography.headlineSmall.copy( fontWeight = FontWeight.Bold, color = PrimaryBlack ) ) Spacer(modifier = Modifier.height(4.dp)) // SKU & Category Row(verticalAlignment = Alignment.CenterVertically) { Text( text = "SKU: ${product.sku.ifBlank { "BNJ-001" }}", style = MaterialTheme.typography.bodySmall.copy(color = MutedGrey) ) Spacer(modifier = Modifier.width(12.dp)) Text( text = "• Kategori: ${product.category}", style = MaterialTheme.typography.bodySmall.copy(color = MutedGrey) ) } Spacer(modifier = Modifier.height(14.dp)) // Price display Row(verticalAlignment = Alignment.Bottom) { Text( text = product.formattedPrice, style = MaterialTheme.typography.headlineMedium.copy( fontWeight = FontWeight.Black, color = PrimaryBlack ) ) if (product.hasDiscount && product.formattedOldPrice != null) { Spacer(modifier = Modifier.width(10.dp)) Text( text = product.formattedOldPrice!!, style = MaterialTheme.typography.titleMedium.copy( textDecoration = TextDecoration.LineThrough, color = MutedGrey ) ) } } Spacer(modifier = Modifier.height(12.dp)) // Stock indicator Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(10.dp) .background( color = if (product.isInStock) SuccessGreen else ErrorRed, shape = CircleShape ) ) Spacer(modifier = Modifier.width(8.dp)) Text( text = if (product.isInStock) "Stokta Var (${product.stock} adet)" else "Stokta Tükendi", style = MaterialTheme.typography.bodyMedium.copy( fontWeight = FontWeight.SemiBold, color = if (product.isInStock) SuccessGreen else ErrorRed ) ) } Spacer(modifier = Modifier.height(20.dp)) // Trust highlights Card( modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = OffWhite), shape = RoundedCornerShape(12.dp) ) { Column(modifier = Modifier.padding(14.dp), verticalArrangement = Arrangement.spacedBy(10.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Outlined.LocalShipping, contentDescription = null, tint = GoldPrimary, modifier = Modifier.size(20.dp)) Spacer(modifier = Modifier.width(10.dp)) Text("500 TL Üzeri Ücretsiz Hızlı Kargo", style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Medium)) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Outlined.CheckCircle, contentDescription = null, tint = GoldPrimary, modifier = Modifier.size(20.dp)) Spacer(modifier = Modifier.width(10.dp)) Text("%100 Orijinal BONJUTERİ Tasarımı", style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Medium)) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Outlined.Security, contentDescription = null, tint = GoldPrimary, modifier = Modifier.size(20.dp)) Spacer(modifier = Modifier.width(10.dp)) Text("Özel Lüks Hediye Kutusu & Garanti Sertifikası", style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Medium)) } } } Spacer(modifier = Modifier.height(20.dp)) // Description Text( text = "Ürün Açıklaması", style = MaterialTheme.typography.titleMedium.copy( fontWeight = FontWeight.Bold, color = PrimaryBlack ) ) Spacer(modifier = Modifier.height(6.dp)) Text( text = product.description.ifBlank { "Özenle işlenmiş kaliteli işçilik ve zarafeti bir araya getiren özel tasarım BONJUTERİ mücevher parçası." }, style = MaterialTheme.typography.bodyMedium.copy( color = MutedGrey, lineHeight = 22.sp ) ) Spacer(modifier = Modifier.height(24.dp)) } } } }