package com.example.ui.admin import androidx.compose.foundation.background 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.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.Phone import androidx.compose.material.icons.filled.Star import androidx.compose.material.icons.filled.StarHalf import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember 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.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.data.model.FoodReview import com.example.ui.theme.AccentGold import com.example.ui.theme.LoveBlack import com.example.ui.theme.LoveRedPrimary import com.example.ui.theme.TextPrimary import com.example.ui.theme.TextSecondary import com.example.viewmodel.AdminViewModel import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @Composable fun AdminReviewsScreen( adminViewModel: AdminViewModel, modifier: Modifier = Modifier ) { val reviews by adminViewModel.allReviews.collectAsState() var searchQuery by remember { mutableStateOf("") } val filteredReviews = remember(reviews, searchQuery) { if (searchQuery.isBlank()) reviews else reviews.filter { it.foodName.contains(searchQuery, ignoreCase = true) || it.customerName.contains(searchQuery, ignoreCase = true) || it.reviewText.contains(searchQuery, ignoreCase = true) } } val avgRating = if (reviews.isNotEmpty()) reviews.map { it.rating }.average() else 4.8 Column( modifier = modifier .fillMaxSize() .background(Color(0xFFF4F5F7)) .padding(16.dp) ) { // Summary Card Card( shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = LoveBlack), modifier = Modifier.fillMaxWidth() ) { Row( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Column { Text( text = "Customer Ratings & Feedback", fontSize = 18.sp, fontWeight = FontWeight.Bold, color = Color.White ) Spacer(modifier = Modifier.height(4.dp)) Text( text = "Total ${reviews.size} Customer Reviews Received", fontSize = 13.sp, color = Color.LightGray ) } Surface( shape = RoundedCornerShape(12.dp), color = AccentGold ) { Row( modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = Icons.Default.Star, contentDescription = null, tint = Color.White, modifier = Modifier.size(20.dp) ) Spacer(modifier = Modifier.width(6.dp)) Text( text = String.format(Locale.getDefault(), "%.1f", avgRating), fontSize = 18.sp, fontWeight = FontWeight.Bold, color = Color.White ) } } } } Spacer(modifier = Modifier.height(16.dp)) // Search Bar (with black input text so user can read what they type) OutlinedTextField( value = searchQuery, onValueChange = { searchQuery = it }, placeholder = { Text("Search by dish, customer, or comment...") }, colors = OutlinedTextFieldDefaults.colors( focusedTextColor = Color.Black, unfocusedTextColor = Color.Black, focusedBorderColor = LoveRedPrimary, unfocusedBorderColor = Color.LightGray, focusedContainerColor = Color.White, unfocusedContainerColor = Color.White ), modifier = Modifier .fillMaxWidth() .testTag("admin_reviews_search"), shape = RoundedCornerShape(12.dp), singleLine = true ) Spacer(modifier = Modifier.height(16.dp)) if (filteredReviews.isEmpty()) { Box( modifier = Modifier .fillMaxSize() .padding(top = 40.dp), contentAlignment = Alignment.TopCenter ) { Text( text = "No customer reviews found matching search.", fontSize = 15.sp, color = TextSecondary ) } } else { LazyColumn( verticalArrangement = Arrangement.spacedBy(12.dp), modifier = Modifier.fillMaxSize() ) { items(filteredReviews) { review -> AdminReviewCard(review = review) } } } } } @Composable fun AdminReviewCard(review: FoodReview) { val dateStr = remember(review.timestamp) { val formatter = SimpleDateFormat("dd MMM yyyy, hh:mm a", Locale.getDefault()) formatter.format(Date(review.timestamp)) } Card( shape = RoundedCornerShape(14.dp), colors = CardDefaults.cardColors(containerColor = Color.White), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), modifier = Modifier.fillMaxWidth() ) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.Top ) { Column(modifier = Modifier.weight(1f)) { Text( text = review.foodName, fontSize = 16.sp, fontWeight = FontWeight.Bold, color = LoveRedPrimary ) Spacer(modifier = Modifier.height(4.dp)) Row(verticalAlignment = Alignment.CenterVertically) { Icon( imageVector = Icons.Default.Person, contentDescription = null, tint = TextSecondary, modifier = Modifier.size(14.dp) ) Spacer(modifier = Modifier.width(4.dp)) Text( text = review.customerName, fontSize = 13.sp, fontWeight = FontWeight.SemiBold, color = TextPrimary ) if (review.customerPhone.isNotBlank()) { Spacer(modifier = Modifier.width(8.dp)) Icon( imageVector = Icons.Default.Phone, contentDescription = null, tint = TextSecondary, modifier = Modifier.size(12.dp) ) Spacer(modifier = Modifier.width(2.dp)) Text( text = review.customerPhone, fontSize = 12.sp, color = TextSecondary ) } } } Surface( shape = RoundedCornerShape(8.dp), color = AccentGold ) { Row( modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = Icons.Default.Star, contentDescription = null, tint = Color.White, modifier = Modifier.size(16.dp) ) Spacer(modifier = Modifier.width(4.dp)) Text( text = "${review.rating.toInt()}★", color = Color.White, fontWeight = FontWeight.Bold, fontSize = 14.sp ) } } } Spacer(modifier = Modifier.height(10.dp)) // Written Comment Box ("kya likh kar rating kiya hai") Surface( shape = RoundedCornerShape(10.dp), color = Color(0xFFF8F9FA), modifier = Modifier.fillMaxWidth() ) { Column(modifier = Modifier.padding(12.dp)) { Text( text = "Customer Written Comment:", fontSize = 11.sp, fontWeight = FontWeight.Bold, color = TextSecondary ) Spacer(modifier = Modifier.height(4.dp)) Text( text = "\"${review.reviewText}\"", fontSize = 14.sp, fontWeight = FontWeight.Medium, color = LoveBlack, lineHeight = 18.sp ) } } Spacer(modifier = Modifier.height(8.dp)) Text( text = "Submitted: $dateStr", fontSize = 11.sp, color = Color.Gray, modifier = Modifier.align(Alignment.End) ) } } }