package com.example.ui.screens import androidx.compose.foundation.background 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.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.Campaign import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Chat import androidx.compose.material.icons.filled.CloudDone import androidx.compose.material.icons.filled.CloudUpload import androidx.compose.material.icons.filled.Group import androidx.compose.material.icons.filled.Leaderboard import androidx.compose.material.icons.filled.PersonAdd import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Shield import androidx.compose.material.icons.filled.TrendingUp import androidx.compose.material.icons.filled.Verified import androidx.compose.material.icons.filled.Warning 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.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush 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 androidx.lifecycle.compose.collectAsStateWithLifecycle import com.example.ui.components.StatusBadge import com.example.ui.theme.EmeraldContainer 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 DashboardScreen( viewModel: MarketingViewModel, modifier: Modifier = Modifier ) { val account by viewModel.account.collectAsStateWithLifecycle() val totalContacts by viewModel.totalContactCount.collectAsStateWithLifecycle() val eligibleContacts by viewModel.eligibleContactCount.collectAsStateWithLifecycle() val campaigns by viewModel.campaigns.collectAsStateWithLifecycle() val leads by viewModel.leads.collectAsStateWithLifecycle() val messages by viewModel.conversations.collectAsStateWithLifecycle() val totalSent = campaigns.sumOf { it.sentCount } val totalDelivered = campaigns.sumOf { it.deliveredCount } val deliveryRate = if (totalSent > 0) ((totalDelivered.toDouble() / totalSent) * 100).toInt() else 98 val indianFormat = NumberFormat.getCurrencyInstance(Locale("en", "IN")) val pipelineTotal = leads.sumOf { it.conversionValue } LazyColumn( modifier = modifier .fillMaxSize() .padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { item { Spacer(modifier = Modifier.height(8.dp)) // Business Profile Header Card Card( modifier = Modifier .fillMaxWidth() .testTag("business_header_card"), shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors( containerColor = MaterialTheme.colorScheme.surface ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Column(modifier = Modifier.padding(16.dp)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(46.dp) .clip(CircleShape) .background( Brush.linearGradient( listOf(EmeraldPrimary, TealSecondary) ) ), contentAlignment = Alignment.Center ) { Text( text = (account?.businessName?.take(2) ?: "DG").uppercase(), color = Color.White, fontWeight = FontWeight.Bold, fontSize = 16.sp ) } Spacer(modifier = Modifier.width(12.dp)) Column { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = account?.businessName ?: "DEWA Gram Udhyog Pvt Ltd", fontWeight = FontWeight.Bold, fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface ) Spacer(modifier = Modifier.width(6.dp)) Icon( imageVector = Icons.Default.Verified, contentDescription = "Meta Verified Business", tint = EmeraldLight, modifier = Modifier.size(16.dp) ) } Text( text = "WABA ID: ${account?.metaWabaId ?: "1378746380406848"} • ${account?.subscriptionPlan ?: "Enterprise Pro"} Tier", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } } StatusBadge(status = account?.status ?: "ACTIVE") } Spacer(modifier = Modifier.height(14.dp)) // Quota progress val quotaLimit = account?.quotaLimit ?: 50000 val quotaUsed = account?.quotaUsed ?: 14320 val quotaPercent = (quotaUsed.toFloat() / quotaLimit.toFloat()).coerceIn(0f, 1f) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = "WhatsApp Cloud Quota (Tier 2: 50k/day)", fontSize = 12.sp, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurfaceVariant ) Text( text = "$quotaUsed / $quotaLimit used", fontSize = 12.sp, fontWeight = FontWeight.Bold, color = EmeraldPrimary ) } Spacer(modifier = Modifier.height(6.dp)) LinearProgressIndicator( progress = { quotaPercent }, modifier = Modifier .fillMaxWidth() .height(8.dp) .clip(RoundedCornerShape(4.dp)), color = EmeraldPrimary, trackColor = EmeraldPrimary.copy(alpha = 0.15f) ) } } } // 4 KPI Cards Grid item { Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(10.dp) ) { KpiCard( title = "Total Contacts", value = totalContacts.toString(), subtitle = "$eligibleContacts WhatsApp Opted-In", icon = Icons.Default.Group, accentColor = EmeraldPrimary, modifier = Modifier.weight(1f) ) KpiCard( title = "Delivery Rate", value = "$deliveryRate%", subtitle = "$totalDelivered msgs delivered", icon = Icons.Default.CloudDone, accentColor = Color(0xFF0284C7), modifier = Modifier.weight(1f) ) } Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(10.dp) ) { KpiCard( title = "CRM Pipeline", value = "₹ ${(pipelineTotal / 100000).toInt()} L", subtitle = "${leads.size} qualified leads", icon = Icons.Default.TrendingUp, accentColor = Color(0xFF7C3AED), modifier = Modifier.weight(1f) ) KpiCard( title = "Consent Compliance", value = "100%", subtitle = "Meta zero-spam policy", icon = Icons.Default.Shield, accentColor = Color(0xFF059669), modifier = Modifier.weight(1f) ) } } } // Quick Actions Row item { Text( text = "Quick Actions", fontWeight = FontWeight.Bold, fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface ) Spacer(modifier = Modifier.height(8.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp) ) { QuickActionButton( label = "New Campaign", icon = Icons.Default.Campaign, onClick = { viewModel.navigateTo(AppScreen.CAMPAIGNS) }, modifier = Modifier.weight(1f) ) QuickActionButton( label = "Import Contacts", icon = Icons.Default.CloudUpload, onClick = { viewModel.navigateTo(AppScreen.CONTACTS) }, modifier = Modifier.weight(1f) ) QuickActionButton( label = "Inbox & Replies", icon = Icons.Default.Chat, onClick = { viewModel.navigateTo(AppScreen.INBOX) }, modifier = Modifier.weight(1f) ) QuickActionButton( label = "Leads CRM", icon = Icons.Default.PersonAdd, onClick = { viewModel.navigateTo(AppScreen.LEADS) }, modifier = Modifier.weight(1f) ) } } // Active Campaigns section item { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text( text = "Broadcast Campaigns", fontWeight = FontWeight.Bold, fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface ) Text( text = "View All (${campaigns.size})", fontSize = 13.sp, color = EmeraldPrimary, fontWeight = FontWeight.SemiBold, modifier = Modifier.clickable { viewModel.navigateTo(AppScreen.CAMPAIGNS) } ) } } items(campaigns.take(2)) { campaign -> Card( modifier = Modifier .fillMaxWidth() .clickable { viewModel.navigateTo(AppScreen.CAMPAIGNS) }, shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface) ) { Column(modifier = Modifier.padding(14.dp)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Column(modifier = Modifier.weight(1f)) { Text( text = campaign.title, fontWeight = FontWeight.Bold, fontSize = 15.sp, color = MaterialTheme.colorScheme.onSurface ) Text( text = "Template: ${campaign.templateName} • Target: ${campaign.categoryNames}", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } StatusBadge(status = campaign.status) } Spacer(modifier = Modifier.height(10.dp)) val progress = if (campaign.targetCount > 0) { (campaign.deliveredCount.toFloat() / campaign.targetCount.toFloat()).coerceIn(0f, 1f) } else 0f LinearProgressIndicator( progress = { progress }, modifier = Modifier .fillMaxWidth() .height(6.dp) .clip(RoundedCornerShape(3.dp)), color = EmeraldPrimary, trackColor = Color(0xFFE2E8F0) ) Spacer(modifier = Modifier.height(8.dp)) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = "Sent: ${campaign.sentCount} | Delivered: ${campaign.deliveredCount} | Read: ${campaign.readCount}", fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) Text( text = "${(progress * 100).toInt()}% Done", fontSize = 11.sp, fontWeight = FontWeight.Bold, color = EmeraldPrimary ) } } } } // Recent Incoming Enquiries item { Text( text = "Recent WhatsApp Inquiries & Webhook Events", fontWeight = FontWeight.Bold, fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface ) } items(messages.filter { it.isIncoming }.take(3)) { msg -> Card( modifier = Modifier .fillMaxWidth() .clickable { viewModel.navigateTo(AppScreen.INBOX) }, shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors( containerColor = MaterialTheme.colorScheme.surface ) ) { Row( modifier = Modifier.padding(12.dp), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(38.dp) .clip(CircleShape) .background(Color(0xFFE0F2FE)), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.Chat, contentDescription = null, tint = Color(0xFF0284C7), modifier = Modifier.size(18.dp) ) } Spacer(modifier = Modifier.width(12.dp)) Column(modifier = Modifier.weight(1f)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = msg.customerName, fontWeight = FontWeight.SemiBold, fontSize = 14.sp, color = MaterialTheme.colorScheme.onSurface ) Text( text = msg.phone, fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } Text( text = msg.messageText, fontSize = 12.sp, maxLines = 1, color = MaterialTheme.colorScheme.onSurfaceVariant ) } } } } item { Spacer(modifier = Modifier.height(20.dp)) } } } @Composable fun KpiCard( title: String, value: String, subtitle: String, icon: androidx.compose.ui.graphics.vector.ImageVector, accentColor: Color, modifier: Modifier = Modifier ) { Card( modifier = modifier, shape = RoundedCornerShape(14.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.CenterVertically ) { Text( text = title, fontSize = 12.sp, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurfaceVariant ) Box( modifier = Modifier .size(30.dp) .clip(CircleShape) .background(accentColor.copy(alpha = 0.12f)), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = null, tint = accentColor, modifier = Modifier.size(16.dp) ) } } Spacer(modifier = Modifier.height(6.dp)) Text( text = value, fontSize = 20.sp, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurface ) Spacer(modifier = Modifier.height(2.dp)) Text( text = subtitle, fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } } } @Composable fun QuickActionButton( label: String, icon: androidx.compose.ui.graphics.vector.ImageVector, onClick: () -> Unit, modifier: Modifier = Modifier ) { Surface( onClick = onClick, modifier = modifier.height(72.dp), shape = RoundedCornerShape(12.dp), color = MaterialTheme.colorScheme.surface, tonalElevation = 2.dp ) { Column( modifier = Modifier .fillMaxSize() .padding(6.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Box( modifier = Modifier .size(32.dp) .clip(CircleShape) .background(EmeraldContainer), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = label, tint = EmeraldDark, modifier = Modifier.size(18.dp) ) } Spacer(modifier = Modifier.height(4.dp)) Text( text = label, fontSize = 11.sp, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface, maxLines = 1 ) } } }