package com.example.ui.admin import android.content.Context import android.content.Intent import android.net.Uri import android.widget.Toast import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable 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.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Call import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.DeliveryDining import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.PowerSettingsNew import androidx.compose.material.icons.filled.Star import androidx.compose.material.icons.filled.TwoWheeler import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults 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.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.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.example.R import com.example.data.model.DeliveryRider import com.example.data.model.RiderStatus 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.AdminViewModel @Composable fun AdminRiderScreen( adminViewModel: AdminViewModel, modifier: Modifier = Modifier ) { val context = LocalContext.current val riders by adminViewModel.allRiders.collectAsState() val orders by adminViewModel.orders.collectAsState() var showAddRiderDialog by remember { mutableStateOf(false) } var editingRider by remember { mutableStateOf(null) } val availableCount = riders.count { it.status == RiderStatus.AVAILABLE } val onDeliveryCount = riders.count { it.status == RiderStatus.ON_DELIVERY } val offlineCount = riders.count { it.status == RiderStatus.OFFLINE } Column( modifier = modifier .fillMaxSize() .padding(horizontal = 16.dp, vertical = 8.dp) ) { // Fleet Header Card Card( shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = Color(0xFF1E102E)), modifier = Modifier.fillMaxWidth() ) { Row( modifier = Modifier.padding(16.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(46.dp) .clip(CircleShape) .background(LoveRedPrimary), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.DeliveryDining, contentDescription = "Riders", tint = Color.White, modifier = Modifier.size(26.dp) ) } Spacer(modifier = Modifier.width(12.dp)) Column { Text( text = "Delivery Riders & Fleet", color = Color.White, fontWeight = FontWeight.Bold, fontSize = 16.sp ) Text( text = "Manage Kumarghat delivery partners & live order dispatch", color = Color(0xFFD1C4E9), fontSize = 11.sp ) } } Button( onClick = { showAddRiderDialog = true }, shape = RoundedCornerShape(10.dp), colors = ButtonDefaults.buttonColors(containerColor = LoveRedPrimary), contentPadding = PaddingValues(horizontal = 10.dp, vertical = 6.dp), modifier = Modifier.testTag("admin_add_rider_button") ) { Icon(Icons.Default.Add, contentDescription = null, modifier = Modifier.size(16.dp)) Spacer(modifier = Modifier.width(4.dp)) Text("Add Rider", fontSize = 11.sp, fontWeight = FontWeight.Bold) } } } Spacer(modifier = Modifier.height(12.dp)) // Metric Statistics Row Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp) ) { RiderMetricCard(title = "Total Fleet", value = "${riders.size}", color = TextPrimary, modifier = Modifier.weight(1f)) RiderMetricCard(title = "Available", value = "$availableCount", color = FreshVegGreen, modifier = Modifier.weight(1f)) RiderMetricCard(title = "On Delivery", value = "$onDeliveryCount", color = Color(0xFFFF6D00), modifier = Modifier.weight(1f)) RiderMetricCard(title = "Off Duty", value = "$offlineCount", color = Color.Gray, modifier = Modifier.weight(1f)) } Spacer(modifier = Modifier.height(14.dp)) Text( text = "Active Kumarghat Delivery Fleet (${riders.size} Riders):", fontSize = 13.sp, fontWeight = FontWeight.Bold, color = TextPrimary ) Spacer(modifier = Modifier.height(8.dp)) if (riders.isEmpty()) { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { Text(text = "No delivery riders registered yet. Tap 'Add Rider' above.", color = TextSecondary) } } else { LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(bottom = 72.dp), verticalArrangement = Arrangement.spacedBy(12.dp) ) { items(riders) { rider -> AdminRiderCard( rider = rider, onCall = { val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:${rider.phone}")) try { context.startActivity(intent) } catch (_: Exception) {} }, onWhatsApp = { val intent = Intent( Intent.ACTION_VIEW, Uri.parse("https://api.whatsapp.com/send?phone=${rider.phone}&text=Hello%20${rider.name},%20delivery%20update%20from%20Love%20Zone%20Restaurant") ) try { context.startActivity(intent) } catch (_: Exception) {} }, onStatusChange = { newStatus -> adminViewModel.updateRiderStatus(rider.id, newStatus) }, onDelete = { adminViewModel.deleteRider(rider) } ) } } } } // Add New Rider Dialog if (showAddRiderDialog) { RiderFormDialog( title = "Register New Delivery Partner", initialName = "", initialPhone = "+91 7005149514", initialVehicle = "Honda Activa (TR-02-)", onDismiss = { showAddRiderDialog = false }, onSave = { name, phone, vehicle -> adminViewModel.saveRider( DeliveryRider( name = name, phone = phone, vehicleNumber = vehicle, status = RiderStatus.AVAILABLE, totalDeliveries = 0, rating = 5.0f ) ) showAddRiderDialog = false Toast.makeText(context, "New rider registered!", Toast.LENGTH_SHORT).show() } ) } } @Composable fun RiderMetricCard( title: String, value: String, color: Color, modifier: Modifier = Modifier ) { Surface( color = Color.White, shape = RoundedCornerShape(12.dp), border = androidx.compose.foundation.BorderStroke(1.dp, Color(0xFFE2E8F0)), modifier = modifier ) { Column( modifier = Modifier.padding(vertical = 10.dp, horizontal = 6.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Text(text = title, fontSize = 10.sp, color = TextSecondary, fontWeight = FontWeight.Medium) Spacer(modifier = Modifier.height(2.dp)) Text(text = value, fontSize = 16.sp, fontWeight = FontWeight.Black, color = color) } } } @Composable fun AdminRiderCard( rider: DeliveryRider, onCall: () -> Unit, onWhatsApp: () -> Unit, onStatusChange: (RiderStatus) -> Unit, onDelete: () -> Unit ) { Card( shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = Color.White), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), modifier = Modifier.fillMaxWidth().testTag("rider_card_${rider.id}") ) { Column(modifier = Modifier.padding(14.dp)) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(44.dp) .clip(CircleShape) .background(Color(0xFFFFF1F2)), contentAlignment = Alignment.Center ) { Image( painter = painterResource(id = R.drawable.img_delivery_rider), contentDescription = "Rider", modifier = Modifier.size(40.dp).clip(CircleShape), contentScale = ContentScale.Crop ) } Spacer(modifier = Modifier.width(10.dp)) Column { Text( text = rider.name, fontWeight = FontWeight.Bold, fontSize = 15.sp, color = TextPrimary ) Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Default.TwoWheeler, contentDescription = null, tint = LoveRedPrimary, modifier = Modifier.size(13.dp)) Spacer(modifier = Modifier.width(4.dp)) Text( text = rider.vehicleNumber, fontSize = 11.sp, color = TextSecondary ) } Text( text = "Phone: ${rider.phone}", fontSize = 11.sp, color = TextSecondary, fontWeight = FontWeight.Medium ) } } // Rider Status Badge RiderStatusBadge(status = rider.status) } Spacer(modifier = Modifier.height(10.dp)) // Rating & Stats strip Row( modifier = Modifier .fillMaxWidth() .background(Color(0xFFF8FAFC), RoundedCornerShape(8.dp)) .padding(horizontal = 10.dp, vertical = 6.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Default.CheckCircle, contentDescription = null, tint = FreshVegGreen, modifier = Modifier.size(14.dp)) Spacer(modifier = Modifier.width(4.dp)) Text(text = "${rider.totalDeliveries} Completed Deliveries", fontSize = 11.sp, fontWeight = FontWeight.SemiBold) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Default.Star, contentDescription = null, tint = AccentGold, modifier = Modifier.size(14.dp)) Spacer(modifier = Modifier.width(2.dp)) Text(text = "${rider.rating}", fontSize = 11.sp, fontWeight = FontWeight.Bold) } } HorizontalDivider(color = Color(0xFFF1F5F9), modifier = Modifier.padding(vertical = 10.dp)) // Bottom Actions: Status Dropdown/Toggles, Call, WhatsApp, Delete Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp) ) { // Change status buttons when (rider.status) { RiderStatus.AVAILABLE -> { OutlinedButton( onClick = { onStatusChange(RiderStatus.OFFLINE) }, shape = RoundedCornerShape(8.dp), contentPadding = PaddingValues(horizontal = 8.dp, vertical = 4.dp), modifier = Modifier.weight(1f).height(36.dp) ) { Text("Go Offline", fontSize = 11.sp, color = TextSecondary) } } RiderStatus.OFFLINE -> { Button( onClick = { onStatusChange(RiderStatus.AVAILABLE) }, shape = RoundedCornerShape(8.dp), colors = ButtonDefaults.buttonColors(containerColor = FreshVegGreen), contentPadding = PaddingValues(horizontal = 8.dp, vertical = 4.dp), modifier = Modifier.weight(1f).height(36.dp) ) { Text("Make Available", fontSize = 11.sp, fontWeight = FontWeight.Bold) } } RiderStatus.ON_DELIVERY -> { Button( onClick = { onStatusChange(RiderStatus.AVAILABLE) }, shape = RoundedCornerShape(8.dp), colors = ButtonDefaults.buttonColors(containerColor = FreshVegGreen), contentPadding = PaddingValues(horizontal = 8.dp, vertical = 4.dp), modifier = Modifier.weight(1f).height(36.dp) ) { Text("Free Rider", fontSize = 11.sp, fontWeight = FontWeight.Bold) } } } // Call Button Button( onClick = onCall, shape = RoundedCornerShape(8.dp), colors = ButtonDefaults.buttonColors(containerColor = LoveRedPrimary), contentPadding = PaddingValues(horizontal = 10.dp, vertical = 4.dp), modifier = Modifier.height(36.dp) ) { Icon(Icons.Default.Call, contentDescription = "Call", modifier = Modifier.size(15.dp)) Spacer(modifier = Modifier.width(4.dp)) Text("Call", fontSize = 11.sp, fontWeight = FontWeight.Bold) } // WhatsApp Button Button( onClick = onWhatsApp, shape = RoundedCornerShape(8.dp), colors = ButtonDefaults.buttonColors(containerColor = FreshVegGreen), contentPadding = PaddingValues(horizontal = 10.dp, vertical = 4.dp), modifier = Modifier.height(36.dp) ) { Text("WhatsApp", fontSize = 11.sp, fontWeight = FontWeight.Bold) } // Delete Rider button IconButton(onClick = onDelete, modifier = Modifier.size(36.dp)) { Icon(Icons.Default.Delete, contentDescription = "Delete", tint = Color.Gray, modifier = Modifier.size(18.dp)) } } } } } @Composable fun RiderStatusBadge(status: RiderStatus) { val (bg, fg, label) = when (status) { RiderStatus.AVAILABLE -> Triple(Color(0xFFE8F5E9), FreshVegGreen, "Available") RiderStatus.ON_DELIVERY -> Triple(Color(0xFFFFF3E0), Color(0xFFE65100), "On Delivery") RiderStatus.OFFLINE -> Triple(Color(0xFFF1F5F9), Color.Gray, "Off Duty") } Surface( color = bg, shape = RoundedCornerShape(12.dp) ) { Row( modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(6.dp) .background(fg, CircleShape) ) Spacer(modifier = Modifier.width(4.dp)) Text(text = label, color = fg, fontSize = 10.sp, fontWeight = FontWeight.Bold) } } } @Composable fun RiderFormDialog( title: String, initialName: String, initialPhone: String, initialVehicle: String, onDismiss: () -> Unit, onSave: (String, String, String) -> Unit ) { var name by remember { mutableStateOf(initialName) } var phone by remember { mutableStateOf(initialPhone) } var vehicle by remember { mutableStateOf(initialVehicle) } AlertDialog( onDismissRequest = onDismiss, title = { Text(text = title, fontWeight = FontWeight.Bold) }, text = { Column( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(10.dp) ) { OutlinedTextField( value = name, onValueChange = { name = it }, label = { Text("Rider Full Name") }, placeholder = { Text("e.g. Bikash Debbarma") }, singleLine = true, shape = RoundedCornerShape(10.dp), colors = OutlinedTextFieldDefaults.colors( focusedTextColor = Color(0xFF1E2022), unfocusedTextColor = Color(0xFF1E2022), focusedContainerColor = Color.White, unfocusedContainerColor = Color(0xFFF8FAFC), cursorColor = LoveRedPrimary, focusedBorderColor = LoveRedPrimary, unfocusedBorderColor = Color(0xFFCBD5E1) ), modifier = Modifier.fillMaxWidth().testTag("rider_name_input") ) OutlinedTextField( value = phone, onValueChange = { phone = it }, label = { Text("Mobile Number") }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone), singleLine = true, shape = RoundedCornerShape(10.dp), colors = OutlinedTextFieldDefaults.colors( focusedTextColor = Color(0xFF1E2022), unfocusedTextColor = Color(0xFF1E2022), focusedContainerColor = Color.White, unfocusedContainerColor = Color(0xFFF8FAFC), cursorColor = LoveRedPrimary, focusedBorderColor = LoveRedPrimary, unfocusedBorderColor = Color(0xFFCBD5E1) ), modifier = Modifier.fillMaxWidth().testTag("rider_phone_input") ) OutlinedTextField( value = vehicle, onValueChange = { vehicle = it }, label = { Text("Vehicle & Number") }, placeholder = { Text("e.g. Honda Activa (TR-02-A-1234)") }, singleLine = true, shape = RoundedCornerShape(10.dp), colors = OutlinedTextFieldDefaults.colors( focusedTextColor = Color(0xFF1E2022), unfocusedTextColor = Color(0xFF1E2022), focusedContainerColor = Color.White, unfocusedContainerColor = Color(0xFFF8FAFC), cursorColor = LoveRedPrimary, focusedBorderColor = LoveRedPrimary, unfocusedBorderColor = Color(0xFFCBD5E1) ), modifier = Modifier.fillMaxWidth().testTag("rider_vehicle_input") ) } }, confirmButton = { Button( onClick = { if (name.isNotBlank()) { onSave(name.trim(), phone.trim(), vehicle.trim()) } }, colors = ButtonDefaults.buttonColors(containerColor = LoveRedPrimary), modifier = Modifier.testTag("save_rider_button") ) { Text("Save Rider") } }, dismissButton = { TextButton(onClick = onDismiss) { Text("Cancel", color = TextSecondary) } } ) }