package com.example.ui.admin import androidx.activity.compose.BackHandler import androidx.compose.animation.Crossfade import androidx.compose.foundation.Image 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.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ExitToApp import androidx.compose.material.icons.filled.Campaign import androidx.compose.material.icons.filled.DeliveryDining import androidx.compose.material.icons.filled.Fastfood import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.QrCode import androidx.compose.material.icons.filled.Receipt import androidx.compose.material.icons.filled.RestaurantMenu import androidx.compose.material.icons.filled.Star import androidx.compose.material.icons.filled.Store import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material.icons.filled.Share import com.example.util.ShareAppHelper import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.OutlinedButton import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.Scaffold import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.TabRowDefaults import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect 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.graphics.vector.ImageVector import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.R import com.example.ui.theme.FreshVegGreen 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 @Composable fun AdminPortalScreen( adminViewModel: AdminViewModel, onExitToCustomerApp: () -> Unit, modifier: Modifier = Modifier ) { val context = androidx.compose.ui.platform.LocalContext.current val selectedTab by adminViewModel.selectedAdminTab.collectAsState() val settings by adminViewModel.adminSettings.collectAsState() val orders by adminViewModel.orders.collectAsState() val activeOrdersCount = orders.count { it.orderStatus != com.example.data.model.OrderStatus.DELIVERED && it.orderStatus != com.example.data.model.OrderStatus.CANCELLED } val riders by adminViewModel.allRiders.collectAsState() val availableRidersCount = riders.count { it.status == com.example.data.model.RiderStatus.AVAILABLE } val customers by adminViewModel.allCustomers.collectAsState() var latestAlertOrder by androidx.compose.runtime.remember { androidx.compose.runtime.mutableStateOf(null) } var previousOrderCount by androidx.compose.runtime.remember { androidx.compose.runtime.mutableStateOf(orders.size) } // Live order listener: Triggers sound alert & pop-up when new order arrives androidx.compose.runtime.LaunchedEffect(orders) { if (orders.size > previousOrderCount) { val newestOrder = orders.maxByOrNull { it.timestamp } if (newestOrder != null) { latestAlertOrder = newestOrder com.example.util.OrderSoundHelper.triggerNewOrderAlert( context, newestOrder.orderId, newestOrder.customerName, newestOrder.grandTotal ) } } previousOrderCount = orders.size } BackHandler { onExitToCustomerApp() } val tabs = listOf( AdminTab("MENU", "Dishes & Photos", Icons.Default.RestaurantMenu), AdminTab("ORDERS", "Orders (${activeOrdersCount})", Icons.Default.Receipt), AdminTab("REVIEWS", "Reviews ⭐", Icons.Default.Star), AdminTab("RIDERS", "Riders ($availableRidersCount)", Icons.Default.DeliveryDining), AdminTab("CUSTOMERS", "Customers (${customers.size})", Icons.Default.Person), AdminTab("PAYMENT_QR", "Payment & QR", Icons.Default.QrCode), AdminTab("NOTIFICATIONS", "Push Alerts", Icons.Default.Campaign) ) Scaffold( modifier = modifier.fillMaxSize(), topBar = { Surface( color = Color(0xFF1E102E), shadowElevation = 4.dp, modifier = Modifier.fillMaxWidth() ) { Column { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(36.dp) .clip(CircleShape) .background(LoveRedPrimary), contentAlignment = Alignment.Center ) { Image( painter = painterResource(id = R.drawable.logo_love_zone), contentDescription = "Logo", modifier = Modifier.size(32.dp).clip(CircleShape) ) } Spacer(modifier = Modifier.width(10.dp)) Column { Text( text = "LOVE ZONE ADMIN", color = Color.White, fontWeight = FontWeight.Black, fontSize = 15.sp ) Row(verticalAlignment = Alignment.CenterVertically) { Text( text = if (settings.isOpen) "Kitchen Open" else "Store Closed", color = if (settings.isOpen) FreshVegGreen else Color.Red, fontSize = 11.sp, fontWeight = FontWeight.Bold ) Spacer(modifier = Modifier.width(6.dp)) Switch( checked = settings.isOpen, onCheckedChange = { adminViewModel.toggleStoreOpen(it) }, colors = SwitchDefaults.colors( checkedThumbColor = Color.White, checkedTrackColor = FreshVegGreen ), modifier = Modifier.size(width = 32.dp, height = 20.dp) ) } } } Row(verticalAlignment = Alignment.CenterVertically) { // Test sound alert button IconButton( onClick = { com.example.util.OrderSoundHelper.triggerNewOrderAlert( context, "TEST99", "Sample Customer", 180.0 ) } ) { Text(text = "🔊", fontSize = 18.sp) } Spacer(modifier = Modifier.width(4.dp)) // Button to exit to Customer App Button( onClick = onExitToCustomerApp, colors = ButtonDefaults.buttonColors(containerColor = LoveRedPrimary), shape = RoundedCornerShape(10.dp), contentPadding = androidx.compose.foundation.layout.PaddingValues(horizontal = 10.dp, vertical = 4.dp), modifier = Modifier.testTag("exit_to_customer_app_button") ) { Icon( imageVector = Icons.AutoMirrored.Filled.ExitToApp, contentDescription = null, modifier = Modifier.size(16.dp) ) Spacer(modifier = Modifier.width(4.dp)) Text(text = "Customer App", fontSize = 11.sp, fontWeight = FontWeight.Bold) } } } // Admin Tab Bar ScrollableTabRow( selectedTabIndex = tabs.indexOfFirst { it.id == selectedTab }.coerceAtLeast(0), containerColor = Color(0xFF1E102E), contentColor = Color.White, edgePadding = 8.dp, indicator = { tabPositions -> val index = tabs.indexOfFirst { it.id == selectedTab }.coerceAtLeast(0) if (index < tabPositions.size) { TabRowDefaults.SecondaryIndicator( modifier = Modifier.tabIndicatorOffset(tabPositions[index]), color = LoveRedPrimary, height = 3.dp ) } } ) { tabs.forEach { tab -> val isSelected = selectedTab == tab.id Tab( selected = isSelected, onClick = { adminViewModel.selectedAdminTab.value = tab.id }, text = { Row(verticalAlignment = Alignment.CenterVertically) { Icon( imageVector = tab.icon, contentDescription = null, tint = if (isSelected) LoveRedPrimary else Color.LightGray, modifier = Modifier.size(16.dp) ) Spacer(modifier = Modifier.width(6.dp)) Text( text = tab.label, fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Medium, fontSize = 12.sp, color = if (isSelected) Color.White else Color.LightGray ) } }, modifier = Modifier.testTag("admin_tab_${tab.id}") ) } } } } } ) { innerPadding -> Box( modifier = Modifier .fillMaxSize() .padding(innerPadding) .background(Color(0xFFF8F9FD)) ) { Column(modifier = Modifier.fillMaxSize()) { // Single Admin Live Remote Control Banner Card( modifier = Modifier .fillMaxWidth() .padding(horizontal = 12.dp, vertical = 6.dp), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = Color(0xFF1E1B4B)) ) { Column(modifier = Modifier.padding(12.dp)) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Row(verticalAlignment = Alignment.CenterVertically) { Surface( color = Color(0xFF10B981), shape = RoundedCornerShape(4.dp) ) { Text( text = "⚡ LIVE SYNC", color = Color.White, fontSize = 9.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp) ) } Spacer(modifier = Modifier.width(8.dp)) Text( text = "Single Admin Panel Live Control", color = Color.White, fontWeight = FontWeight.Bold, fontSize = 13.sp ) } } Spacer(modifier = Modifier.height(4.dp)) Text( text = "Sabhi customer devices aapke is ek Admin Panel se live synced hain! Menu, rate, open status, QR aur alerts update karne ke liye bar-bar APK bhejna bilkul zaruri nahi hai.", color = Color(0xFFC7D2FE), fontSize = 11.sp, lineHeight = 15.sp ) } } // Realtime New Order Sound Alert Pop-up Banner latestAlertOrder?.let { alertOrder -> Card( modifier = Modifier .fillMaxWidth() .padding(12.dp), shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = Color(0xFF991B1B)), elevation = CardDefaults.cardElevation(defaultElevation = 8.dp) ) { Column(modifier = Modifier.padding(16.dp)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "🚨", fontSize = 22.sp) Spacer(modifier = Modifier.width(8.dp)) Text( text = "NAYA ORDER AAYA HAI! #${alertOrder.orderId}", fontWeight = FontWeight.Black, fontSize = 15.sp, color = Color.White ) } Surface( color = Color.White.copy(alpha = 0.2f), shape = RoundedCornerShape(20.dp), modifier = Modifier.clip(CircleShape) ) { Text( text = "JUST NOW", color = Color.White, fontSize = 10.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp) ) } } Spacer(modifier = Modifier.height(8.dp)) Text( text = "Customer: ${alertOrder.customerName} (${alertOrder.customerPhone})", color = Color.White, fontSize = 13.sp, fontWeight = FontWeight.Bold ) Text( text = "Total Amount: ₹${alertOrder.grandTotal.toInt()} • ${alertOrder.items.size} Items • ${alertOrder.paymentMethod}", color = Color(0xFFFDE68A), fontSize = 12.sp, fontWeight = FontWeight.Medium ) Spacer(modifier = Modifier.height(12.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End ) { OutlinedButton( onClick = { latestAlertOrder = null }, colors = ButtonDefaults.outlinedButtonColors(contentColor = Color.White), border = androidx.compose.foundation.BorderStroke(1.dp, Color.White), shape = RoundedCornerShape(10.dp) ) { Text(text = "Dismiss", fontSize = 12.sp) } Spacer(modifier = Modifier.width(8.dp)) Button( onClick = { adminViewModel.selectedAdminTab.value = "ORDERS" latestAlertOrder = null }, colors = ButtonDefaults.buttonColors(containerColor = Color.White, contentColor = Color(0xFF991B1B)), shape = RoundedCornerShape(10.dp) ) { Text(text = "View Order Details 📋", fontWeight = FontWeight.Bold, fontSize = 12.sp) } } } } } Crossfade(targetState = selectedTab, label = "AdminTabCrossfade", modifier = Modifier.weight(1f)) { tab -> when (tab) { "MENU" -> AdminMenuManagementScreen(adminViewModel = adminViewModel) "ORDERS" -> AdminOrdersScreen(adminViewModel = adminViewModel) "REVIEWS" -> AdminReviewsScreen(adminViewModel = adminViewModel) "RIDERS" -> AdminRiderScreen(adminViewModel = adminViewModel) "CUSTOMERS" -> AdminCustomerScreen(adminViewModel = adminViewModel) "PAYMENT_QR" -> AdminPaymentQrScreen(adminViewModel = adminViewModel) "NOTIFICATIONS" -> AdminNotificationScreen(adminViewModel = adminViewModel) } } } } } } data class AdminTab( val id: String, val label: String, val icon: ImageVector )