package com.example.ui.customer 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.PaddingValues 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.CheckCircle import androidx.compose.material.icons.filled.Discount import androidx.compose.material.icons.filled.Info import androidx.compose.material.icons.filled.Notifications import androidx.compose.material.icons.filled.NotificationsNone import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.data.model.AppNotification import com.example.ui.theme.AccentGold import com.example.ui.theme.FreshVegGreen import com.example.ui.theme.LoveRedPrimary import com.example.ui.theme.TextPrimary import com.example.ui.theme.TextSecondary import com.example.viewmodel.CustomerViewModel import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @Composable fun AlertsScreen( customerViewModel: CustomerViewModel, modifier: Modifier = Modifier ) { val notifications by customerViewModel.allNotifications.collectAsState() Column( modifier = modifier .fillMaxSize() .background(Color(0xFFF8F9FD)) ) { // Top Header Surface( color = Color.White, shadowElevation = 2.dp, modifier = Modifier.fillMaxWidth() ) { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = "ALERTS", fontSize = 18.sp, fontWeight = FontWeight.Black, color = TextPrimary ) if (notifications.isNotEmpty()) { TextButton( onClick = { customerViewModel.markNotificationsRead() }, modifier = Modifier.testTag("mark_all_read_button") ) { Text(text = "Mark all read", color = LoveRedPrimary, fontSize = 12.sp) } } } } if (notifications.isEmpty()) { // Empty Alerts state matching video at 00:36 Box( modifier = Modifier .fillMaxSize() .padding(24.dp), contentAlignment = Alignment.Center ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Box( modifier = Modifier .size(110.dp) .background(Color(0xFFF1F5F9), CircleShape), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.NotificationsNone, contentDescription = "Alerts", tint = Color.Gray, modifier = Modifier.size(54.dp) ) } Spacer(modifier = Modifier.height(20.dp)) Text( text = "No new alerts", fontSize = 18.sp, fontWeight = FontWeight.Bold, color = TextPrimary ) Spacer(modifier = Modifier.height(6.dp)) Text( text = "You're all caught up! Order updates, offers, and delivery alerts will appear here.", fontSize = 13.sp, color = TextSecondary, textAlign = TextAlign.Center, modifier = Modifier.padding(horizontal = 24.dp) ) Spacer(modifier = Modifier.height(20.dp)) Button( onClick = { /* Refresh */ }, shape = RoundedCornerShape(10.dp), colors = ButtonDefaults.buttonColors(containerColor = FreshVegGreen) ) { Icon(Icons.Default.Refresh, contentDescription = null, modifier = Modifier.size(16.dp)) Spacer(modifier = Modifier.width(6.dp)) Text(text = "Check Again", fontWeight = FontWeight.Bold) } } } } else { LazyColumn( modifier = Modifier .fillMaxSize() .padding(bottom = 80.dp), contentPadding = PaddingValues(16.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { items(notifications) { notification -> NotificationCard(notification) } } } } } @Composable fun NotificationCard(notification: AppNotification) { val dateStr = SimpleDateFormat("dd MMM, hh:mm a", Locale.getDefault()).format(Date(notification.timestamp)) val (icon, iconColor, bgIconColor) = when (notification.type) { "OFFER" -> Triple(Icons.Default.Discount, AccentGold, Color(0xFFFFF8E1)) "ORDER_UPDATE" -> Triple(Icons.Default.CheckCircle, FreshVegGreen, Color(0xFFE8F5E9)) else -> Triple(Icons.Default.Info, LoveRedPrimary, Color(0xFFFFF1F2)) } Card( shape = RoundedCornerShape(14.dp), colors = CardDefaults.cardColors( containerColor = if (notification.isRead) Color.White else Color(0xFFFFF7ED) ), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp), modifier = Modifier.fillMaxWidth().testTag("alert_item_${notification.id}") ) { Row( modifier = Modifier.padding(14.dp), verticalAlignment = Alignment.Top ) { Box( modifier = Modifier .size(40.dp) .background(bgIconColor, CircleShape), contentAlignment = Alignment.Center ) { Icon(imageVector = icon, contentDescription = null, tint = iconColor, modifier = Modifier.size(20.dp)) } Spacer(modifier = Modifier.width(12.dp)) Column(modifier = Modifier.weight(1f)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text( text = notification.title, fontWeight = FontWeight.Bold, fontSize = 14.sp, color = TextPrimary, modifier = Modifier.weight(1f) ) if (!notification.isRead) { Box( modifier = Modifier .size(8.dp) .background(LoveRedPrimary, CircleShape) ) } } Spacer(modifier = Modifier.height(4.dp)) Text( text = notification.message, fontSize = 12.sp, color = TextSecondary, lineHeight = 17.sp ) Spacer(modifier = Modifier.height(6.dp)) Text( text = dateStr, fontSize = 10.sp, color = Color.Gray ) } } } }