package com.example.ui.screens import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable 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.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AdminPanelSettings import androidx.compose.material.icons.filled.Business import androidx.compose.material.icons.filled.Campaign import androidx.compose.material.icons.filled.Chat import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.FlashOn import androidx.compose.material.icons.filled.Lock import androidx.compose.material.icons.filled.Phone import androidx.compose.material.icons.filled.Refresh import androidx.compose.material.icons.filled.Security import androidx.compose.material.icons.filled.Verified import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator 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.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.MarketingViewModel import com.example.ui.viewmodel.UserRole @Composable fun LoginScreen( viewModel: MarketingViewModel, modifier: Modifier = Modifier ) { val context = LocalContext.current val isSendingOtp by viewModel.isSendingOtp.collectAsStateWithLifecycle() val otpSent by viewModel.loginOtpSent.collectAsStateWithLifecycle() val generatedOtp by viewModel.currentGeneratedOtp.collectAsStateWithLifecycle() val otpTimer by viewModel.otpTimerSeconds.collectAsStateWithLifecycle() val otpNotification by viewModel.otpDeliveryNotification.collectAsStateWithLifecycle() var selectedUserType by remember { mutableStateOf(UserRole.CONSUMER) } var phoneNumber by remember { mutableStateOf("9461321162") } var enteredOtp by remember { mutableStateOf("") } Column( modifier = modifier .fillMaxSize() .background(Color(0xFFF8FAFC)) .verticalScroll(rememberScrollState()) .padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Spacer(modifier = Modifier.height(24.dp)) // Platform Brand Header Box( modifier = Modifier .size(68.dp) .clip(CircleShape) .background( Brush.linearGradient( listOf(EmeraldPrimary, TealSecondary) ) ), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.Campaign, contentDescription = "Narada Logo", tint = Color.White, modifier = Modifier.size(38.dp) ) } Spacer(modifier = Modifier.height(12.dp)) Row(verticalAlignment = Alignment.CenterVertically) { Text( text = "Narada", fontSize = 28.sp, fontWeight = FontWeight.Bold, color = EmeraldDark ) Spacer(modifier = Modifier.width(6.dp)) Icon( imageVector = Icons.Default.Verified, contentDescription = "Official Meta API", tint = EmeraldPrimary, modifier = Modifier.size(22.dp) ) } Text( text = "Bulk Business Messaging & WhatsApp Marketing", fontSize = 13.sp, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(4.dp)) Surface( shape = RoundedCornerShape(12.dp), color = Color(0xFFF0FDF4), border = androidx.compose.foundation.BorderStroke(1.dp, EmeraldLight.copy(alpha = 0.5f)) ) { Text( text = "DEWA Gram Udhyog Pvt Ltd • Bhiwani HR", fontSize = 11.sp, fontWeight = FontWeight.SemiBold, color = EmeraldDark, modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp) ) } Spacer(modifier = Modifier.height(20.dp)) // Step 1: Select Application Login User Type Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Column(modifier = Modifier.padding(16.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(24.dp) .clip(CircleShape) .background(EmeraldPrimary), contentAlignment = Alignment.Center ) { Text("1", color = Color.White, fontWeight = FontWeight.Bold, fontSize = 12.sp) } Spacer(modifier = Modifier.width(8.dp)) Text( text = "Select Application Login User Type", fontWeight = FontWeight.Bold, fontSize = 15.sp ) } Spacer(modifier = Modifier.height(6.dp)) Text( text = "Application login permissions and features are strictly tailored per User Type:", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(12.dp)) // User Type Option 1: Business Consumer UserTypeSelectionCard( title = "Business Consumer", subtitle = "DEWA Gram Udhyog campaigns, contact lists, CSV uploads, CRM leads & customer inbox", icon = Icons.Default.Business, accentColor = EmeraldPrimary, isSelected = selectedUserType == UserRole.CONSUMER, testTag = "user_type_consumer", onClick = { selectedUserType = UserRole.CONSUMER } ) Spacer(modifier = Modifier.height(8.dp)) // User Type Option 2: Admin UserTypeSelectionCard( title = "Admin", subtitle = "Contact approvals, consent record audits, campaign operations & lead routing", icon = Icons.Default.Security, accentColor = Color(0xFF0284C7), isSelected = selectedUserType == UserRole.ADMIN, testTag = "user_type_admin", onClick = { selectedUserType = UserRole.ADMIN } ) Spacer(modifier = Modifier.height(8.dp)) // User Type Option 3: Super Admin UserTypeSelectionCard( title = "Super Admin", subtitle = "Complete platform governance, Meta WABA setup, multi-tenant quotas & subscription plans", icon = Icons.Default.AdminPanelSettings, accentColor = Color(0xFFD97706), isSelected = selectedUserType == UserRole.SUPER_ADMIN, testTag = "user_type_super_admin", onClick = { selectedUserType = UserRole.SUPER_ADMIN } ) } } Spacer(modifier = Modifier.height(16.dp)) // Step 2 & 3: Mobile Number & OTP Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(16.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Column(modifier = Modifier.padding(16.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Box( modifier = Modifier .size(24.dp) .clip(CircleShape) .background(EmeraldPrimary), contentAlignment = Alignment.Center ) { Text("2", color = Color.White, fontWeight = FontWeight.Bold, fontSize = 12.sp) } Spacer(modifier = Modifier.width(8.dp)) Text( text = "Login with OTP on WhatsApp", fontWeight = FontWeight.Bold, fontSize = 15.sp ) } Spacer(modifier = Modifier.height(12.dp)) Text( text = "WhatsApp Mobile Number", fontSize = 12.sp, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(4.dp)) OutlinedTextField( value = phoneNumber, onValueChange = { phoneNumber = it.filter { ch -> ch.isDigit() } }, leadingIcon = { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(start = 12.dp, end = 6.dp) ) { Text("+91", fontWeight = FontWeight.Bold, fontSize = 14.sp) Spacer(modifier = Modifier.width(4.dp)) Box( modifier = Modifier .width(1.dp) .height(20.dp) .background(Color.Gray.copy(alpha = 0.4f)) ) } }, placeholder = { Text("10 digit WhatsApp number") }, singleLine = true, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), modifier = Modifier .fillMaxWidth() .testTag("login_phone_input") ) Spacer(modifier = Modifier.height(8.dp)) // Quick Phone Selection Chips for testing Text( text = "Quick Select Authorized Numbers:", fontSize = 11.sp, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(4.dp)) Row( modifier = Modifier .fillMaxWidth() .horizontalScroll(rememberScrollState()), horizontalArrangement = Arrangement.spacedBy(6.dp) ) { QuickPhoneChip(label = "9461321162 (DEWA)", phone = "9461321162") { phoneNumber = it } QuickPhoneChip(label = "9315321162 (Dinesh)", phone = "9315321162") { phoneNumber = it } QuickPhoneChip(label = "9355321162 (Bimla)", phone = "9355321162") { phoneNumber = it } QuickPhoneChip(label = "6000072002 (Vikash)", phone = "6000072002") { phoneNumber = it } QuickPhoneChip(label = "9812405817 (Ajay)", phone = "9812405817") { phoneNumber = it } QuickPhoneChip(label = "7600910000 (Sudhir)", phone = "7600910000") { phoneNumber = it } } Spacer(modifier = Modifier.height(14.dp)) // Send OTP Button Button( onClick = { if (phoneNumber.length >= 10) { viewModel.sendWhatsAppOtp(phoneNumber, selectedUserType) } else { Toast.makeText(context, "Please enter valid 10-digit mobile number", Toast.LENGTH_SHORT).show() } }, enabled = !isSendingOtp && phoneNumber.length >= 10 && (otpTimer == 0 || !otpSent), modifier = Modifier .fillMaxWidth() .height(48.dp) .testTag("send_otp_button"), colors = ButtonDefaults.buttonColors(containerColor = EmeraldPrimary) ) { if (isSendingOtp) { CircularProgressIndicator( color = Color.White, modifier = Modifier.size(20.dp), strokeWidth = 2.dp ) Spacer(modifier = Modifier.width(8.dp)) Text("Sending live WhatsApp OTP via Meta API...") } else { Icon(Icons.Default.Chat, contentDescription = null, modifier = Modifier.size(18.dp)) Spacer(modifier = Modifier.width(8.dp)) Text( text = if (otpSent) { if (otpTimer > 0) "Resend OTP on WhatsApp (${otpTimer}s)" else "Resend OTP on WhatsApp" } else { "Send OTP on WhatsApp" } ) } } // WhatsApp Incoming Notification Simulation Card if (otpNotification != null) { Spacer(modifier = Modifier.height(12.dp)) Surface( shape = RoundedCornerShape(12.dp), color = Color(0xFFF0FDF4), border = androidx.compose.foundation.BorderStroke(1.dp, EmeraldPrimary.copy(alpha = 0.4f)), modifier = Modifier.fillMaxWidth() ) { Column(modifier = Modifier.padding(12.dp)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( imageVector = Icons.Default.Chat, contentDescription = null, tint = EmeraldPrimary, modifier = Modifier.size(16.dp) ) Spacer(modifier = Modifier.width(6.dp)) Text( text = "Incoming WhatsApp Message", fontWeight = FontWeight.Bold, fontSize = 12.sp, color = EmeraldDark ) } IconButton( onClick = { viewModel.dismissOtpNotification() }, modifier = Modifier.size(20.dp) ) { Icon(Icons.Default.Close, contentDescription = "Dismiss", modifier = Modifier.size(14.dp)) } } Spacer(modifier = Modifier.height(4.dp)) Text( text = otpNotification ?: "", fontSize = 11.sp, color = Color(0xFF166534) ) Spacer(modifier = Modifier.height(8.dp)) if (generatedOtp != null) { Button( onClick = { enteredOtp = generatedOtp ?: "" }, shape = RoundedCornerShape(8.dp), colors = ButtonDefaults.buttonColors(containerColor = EmeraldPrimary), modifier = Modifier.testTag("autofill_otp_button") ) { Icon(Icons.Default.FlashOn, contentDescription = null, modifier = Modifier.size(14.dp)) Spacer(modifier = Modifier.width(6.dp)) Text("1-Tap Auto-Fill OTP: $generatedOtp", fontSize = 11.sp) } } } } } // OTP Verification Input Block if (otpSent) { Spacer(modifier = Modifier.height(16.dp)) Text( text = "Enter 6-Digit WhatsApp OTP", fontSize = 12.sp, fontWeight = FontWeight.SemiBold ) Spacer(modifier = Modifier.height(4.dp)) OutlinedTextField( value = enteredOtp, onValueChange = { if (it.length <= 6) enteredOtp = it.filter { c -> c.isDigit() } }, leadingIcon = { Icon(Icons.Default.Lock, contentDescription = null, tint = EmeraldPrimary) }, placeholder = { Text("e.g. $generatedOtp or 123456") }, singleLine = true, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), modifier = Modifier .fillMaxWidth() .testTag("otp_input"), textStyle = androidx.compose.ui.text.TextStyle( fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Bold, fontSize = 18.sp ) ) Spacer(modifier = Modifier.height(12.dp)) // Verify & Login Button Button( onClick = { val success = viewModel.verifyOtpAndLogin( enteredOtp = enteredOtp, selectedRole = selectedUserType, phone = "+91$phoneNumber" ) if (success) { Toast.makeText(context, "Logged in as ${selectedUserType.name.replace("_", " ")}!", Toast.LENGTH_SHORT).show() } else { Toast.makeText(context, "Invalid OTP code", Toast.LENGTH_SHORT).show() } }, enabled = enteredOtp.length == 6, colors = ButtonDefaults.buttonColors(containerColor = EmeraldPrimary), modifier = Modifier .fillMaxWidth() .height(48.dp) .testTag("verify_otp_button") ) { Icon(Icons.Default.CheckCircle, contentDescription = null, modifier = Modifier.size(18.dp)) Spacer(modifier = Modifier.width(8.dp)) Text("Verify OTP & Login as ${selectedUserType.name.replace("_", " ")}", fontWeight = FontWeight.Bold) } } Spacer(modifier = Modifier.height(12.dp)) // Developer / Testing Direct Bypass OutlinedButton( onClick = { viewModel.directBypassLogin( selectedRole = selectedUserType, phone = "+91$phoneNumber" ) }, modifier = Modifier .fillMaxWidth() .height(44.dp) .testTag("test_direct_login_button") ) { Icon(Icons.Default.FlashOn, contentDescription = null, modifier = Modifier.size(16.dp)) Spacer(modifier = Modifier.width(6.dp)) Text("Instant Test Login as ${selectedUserType.name.replace("_", " ")}", fontSize = 12.sp) } } } Spacer(modifier = Modifier.height(20.dp)) // Footer Meta Verified info Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Default.Verified, contentDescription = null, tint = EmeraldPrimary, modifier = Modifier.size(14.dp)) Spacer(modifier = Modifier.width(4.dp)) Text( text = "Official Meta WhatsApp Business Cloud API v21.0 Certified", fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant ) } Spacer(modifier = Modifier.height(24.dp)) } } @Composable fun UserTypeSelectionCard( title: String, subtitle: String, icon: androidx.compose.ui.graphics.vector.ImageVector, accentColor: Color, isSelected: Boolean, testTag: String, onClick: () -> Unit ) { Surface( onClick = onClick, shape = RoundedCornerShape(12.dp), color = if (isSelected) accentColor.copy(alpha = 0.08f) else MaterialTheme.colorScheme.surface, border = androidx.compose.foundation.BorderStroke( width = if (isSelected) 2.dp else 1.dp, color = if (isSelected) accentColor else Color(0xFFE2E8F0) ), modifier = Modifier .fillMaxWidth() .testTag(testTag) ) { Row( modifier = Modifier.padding(12.dp), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(40.dp) .clip(CircleShape) .background(if (isSelected) accentColor else Color(0xFFF1F5F9)), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = null, tint = if (isSelected) Color.White else Color(0xFF64748B), modifier = Modifier.size(22.dp) ) } Spacer(modifier = Modifier.width(12.dp)) Column(modifier = Modifier.weight(1f)) { Text( text = title, fontWeight = FontWeight.Bold, fontSize = 14.sp, color = if (isSelected) accentColor else MaterialTheme.colorScheme.onSurface ) Text( text = subtitle, fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurfaceVariant, lineHeight = 14.sp ) } if (isSelected) { Spacer(modifier = Modifier.width(8.dp)) Icon( imageVector = Icons.Default.CheckCircle, contentDescription = "Selected", tint = accentColor, modifier = Modifier.size(20.dp) ) } } } } @Composable fun QuickPhoneChip( label: String, phone: String, onClick: (String) -> Unit ) { Surface( onClick = { onClick(phone) }, shape = RoundedCornerShape(14.dp), color = Color(0xFFF1F5F9) ) { Text( text = label, fontSize = 11.sp, fontWeight = FontWeight.Medium, color = Color(0xFF334155), modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp) ) } }