package com.example.ui.screens import android.content.Intent import android.net.Uri import androidx.compose.foundation.horizontalScroll 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.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.ArrowForward import androidx.compose.material.icons.filled.Call import androidx.compose.material.icons.filled.Chat import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Event import androidx.compose.material.icons.filled.FilterList import androidx.compose.material.icons.filled.Person 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.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable 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.graphics.Color import androidx.compose.ui.platform.LocalContext 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 androidx.lifecycle.compose.collectAsStateWithLifecycle import com.example.data.local.entity.LeadEntity import com.example.ui.components.StatusBadge import com.example.ui.theme.EmeraldDark import com.example.ui.theme.EmeraldLight import com.example.ui.theme.EmeraldPrimary import com.example.ui.theme.TealSecondary import com.example.ui.viewmodel.AppScreen import com.example.ui.viewmodel.MarketingViewModel import java.text.NumberFormat import java.util.Locale @Composable fun LeadsCrmScreen( viewModel: MarketingViewModel, modifier: Modifier = Modifier ) { val context = LocalContext.current val leads by viewModel.leads.collectAsStateWithLifecycle() var selectedStageFilter by remember { mutableStateOf(null) } var showAddLeadModal by remember { mutableStateOf(false) } val stages = listOf("NEW", "CONTACTED", "INTERESTED", "FOLLOW_UP", "QUOTATION_SENT", "CONVERTED", "LOST") val filteredLeads = if (selectedStageFilter == null) { leads } else { leads.filter { it.status == selectedStageFilter } } val totalPipeline = leads.filter { it.status != "LOST" }.sumOf { it.conversionValue } val convertedTotal = leads.filter { it.status == "CONVERTED" }.sumOf { it.conversionValue } Box(modifier = modifier.fillMaxSize()) { Column( modifier = Modifier .fillMaxSize() .padding(horizontal = 16.dp) ) { Spacer(modifier = Modifier.height(8.dp)) // Pipeline Summary Card Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(14.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Row( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween ) { Column { Text("Active Pipeline Value", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) Text( text = "₹ ${(totalPipeline / 100000).toInt()} Lakhs", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = EmeraldPrimary ) } Column(horizontalAlignment = Alignment.End) { Text("Total Converted Revenue", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) Text( text = "₹ ${(convertedTotal / 100000).toInt()} Lakhs", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = Color(0xFF0284C7) ) } } } Spacer(modifier = Modifier.height(12.dp)) // Status stage filters Row( modifier = Modifier .fillMaxWidth() .horizontalScroll(rememberScrollState()), horizontalArrangement = Arrangement.spacedBy(6.dp) ) { FilterChip( selected = selectedStageFilter == null, onClick = { selectedStageFilter = null }, label = { Text("All Stages (${leads.size})", fontSize = 11.sp) }, colors = FilterChipDefaults.filterChipColors( selectedContainerColor = EmeraldPrimary.copy(alpha = 0.15f), selectedLabelColor = EmeraldPrimary ) ) stages.forEach { stage -> val count = leads.count { it.status == stage } FilterChip( selected = selectedStageFilter == stage, onClick = { selectedStageFilter = if (selectedStageFilter == stage) null else stage }, label = { Text("${stage.replace("_", " ")} ($count)", fontSize = 11.sp) }, colors = FilterChipDefaults.filterChipColors( selectedContainerColor = EmeraldPrimary.copy(alpha = 0.15f), selectedLabelColor = EmeraldPrimary ) ) } } Spacer(modifier = Modifier.height(10.dp)) // Leads List if (filteredLeads.isEmpty()) { Box( modifier = Modifier .fillMaxSize() .weight(1f), contentAlignment = Alignment.Center ) { Text( text = "No leads in this stage.", fontSize = 14.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } } else { LazyColumn( modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(12.dp) ) { items(filteredLeads) { lead -> LeadCard( lead = lead, onAdvanceStage = { val nextStage = when (lead.status) { "NEW" -> "CONTACTED" "CONTACTED" -> "INTERESTED" "INTERESTED" -> "FOLLOW_UP" "FOLLOW_UP" -> "QUOTATION_SENT" "QUOTATION_SENT" -> "CONVERTED" else -> "CONVERTED" } viewModel.updateLeadStatus(lead.id, nextStage) }, onOpenChat = { viewModel.navigateTo(AppScreen.INBOX) }, onCall = { val dialIntent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:${lead.mobileNumber}")) context.startActivity(dialIntent) } ) } item { Spacer(modifier = Modifier.height(72.dp)) } } } } // FAB to Add Lead FloatingActionButton( onClick = { showAddLeadModal = true }, modifier = Modifier .align(Alignment.BottomEnd) .padding(20.dp) .testTag("add_lead_fab"), containerColor = EmeraldPrimary, contentColor = Color.White ) { Icon(Icons.Default.Add, contentDescription = "Add Lead") } if (showAddLeadModal) { AddLeadDialog( onDismiss = { showAddLeadModal = false }, onSave = { newLead -> viewModel.addNewLead(newLead) showAddLeadModal = false } ) } } } @Composable fun LeadCard( lead: LeadEntity, onAdvanceStage: () -> Unit, onOpenChat: () -> Unit, onCall: () -> Unit ) { Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp) ) { Column(modifier = Modifier.padding(14.dp)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.Top ) { Column(modifier = Modifier.weight(1f)) { Text( text = lead.customerName, fontWeight = FontWeight.Bold, fontSize = 15.sp, color = MaterialTheme.colorScheme.onSurface ) Text( text = "${lead.businessName} • Phone: ${lead.mobileNumber}", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) Text( text = "Source: ${lead.campaignSource}", fontSize = 11.sp, color = EmeraldPrimary, fontWeight = FontWeight.Medium ) } StatusBadge(status = lead.status) } Spacer(modifier = Modifier.height(8.dp)) Surface( color = Color(0xFFF8FAFC), shape = RoundedCornerShape(8.dp), modifier = Modifier.fillMaxWidth() ) { Column(modifier = Modifier.padding(8.dp)) { Text( text = "Interest: ${lead.productInterest}", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurface ) Text( text = lead.enquiryDescription, fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) if (lead.salesNotes.isNotBlank()) { Spacer(modifier = Modifier.height(4.dp)) Text( text = "Notes: ${lead.salesNotes}", fontSize = 11.sp, color = Color(0xFF475569) ) } } } Spacer(modifier = Modifier.height(8.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Default.Event, contentDescription = null, tint = Color.Gray, modifier = Modifier.size(14.dp)) Spacer(modifier = Modifier.width(4.dp)) Text( text = "Follow-up: ${lead.followUpDate} • ${lead.assignedTo}", fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } Text( text = "₹ ${lead.conversionValue.toInt()}", fontWeight = FontWeight.Bold, fontSize = 14.sp, color = EmeraldPrimary ) } Spacer(modifier = Modifier.height(10.dp)) // Action row Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { IconButton(onClick = onCall, modifier = Modifier.size(34.dp)) { Icon(Icons.Default.Call, contentDescription = "Call", tint = EmeraldPrimary, modifier = Modifier.size(18.dp)) } IconButton(onClick = onOpenChat, modifier = Modifier.size(34.dp)) { Icon(Icons.Default.Chat, contentDescription = "Chat", tint = Color(0xFF0284C7), modifier = Modifier.size(18.dp)) } } if (lead.status != "CONVERTED" && lead.status != "LOST") { OutlinedButton( onClick = onAdvanceStage, shape = RoundedCornerShape(8.dp) ) { Text("Advance Stage", fontSize = 11.sp) Spacer(modifier = Modifier.width(4.dp)) Icon(Icons.Default.ArrowForward, contentDescription = null, modifier = Modifier.size(12.dp)) } } } } } } @Composable fun AddLeadDialog( onDismiss: () -> Unit, onSave: (LeadEntity) -> Unit ) { var name by remember { mutableStateOf("") } var phone by remember { mutableStateOf("") } var company by remember { mutableStateOf("") } var interest by remember { mutableStateOf("Commercial Solar Rooftop") } var valueStr by remember { mutableStateOf("250000") } var followUpDate by remember { mutableStateOf("2026-10-25") } var notes by remember { mutableStateOf("") } AlertDialog( onDismissRequest = onDismiss, title = { Text("Create New Sales Lead") }, text = { Column( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { OutlinedTextField( value = name, onValueChange = { name = it }, label = { Text("Prospect Name *") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = phone, onValueChange = { phone = it }, label = { Text("Phone Number (+91...) *") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = company, onValueChange = { company = it }, label = { Text("Business / Company Name") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = interest, onValueChange = { interest = it }, label = { Text("Product / Project Interest") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = valueStr, onValueChange = { valueStr = it }, label = { Text("Estimated Deal Value (₹)") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = followUpDate, onValueChange = { followUpDate = it }, label = { Text("Follow-Up Date (YYYY-MM-DD)") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = notes, onValueChange = { notes = it }, label = { Text("Enquiry Notes") }, modifier = Modifier.fillMaxWidth() ) } }, confirmButton = { Button( onClick = { if (name.isNotBlank() && phone.isNotBlank()) { onSave( LeadEntity( customerName = name, mobileNumber = if (phone.startsWith("+")) phone else "+91$phone", businessName = company, campaignSource = "Direct WhatsApp Lead", productInterest = interest, enquiryDescription = notes.ifEmpty { "Manual lead creation" }, status = "NEW", assignedTo = "Rahul Sharma", followUpDate = followUpDate, conversionValue = valueStr.toDoubleOrNull() ?: 0.0, salesNotes = notes ) ) } }, colors = ButtonDefaults.buttonColors(containerColor = EmeraldPrimary) ) { Text("Save Lead") } }, dismissButton = { TextButton(onClick = onDismiss) { Text("Cancel") } } ) }