package com.simats.risenow.ui.screens import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState 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.Email import androidx.compose.material.icons.filled.Lock import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.platform.LocalContext import android.widget.Toast import retrofit2.Call import retrofit2.Callback import retrofit2.Response import com.simats.risenow.data.remote.* import com.simats.risenow.ui.components.* import com.simats.risenow.ui.theme.* @Composable fun LoginScreen( onLoginSuccess: (userId: String, name: String, identity: String, statement: String) -> Unit, onNavigateToSignup: () -> Unit ) { var email by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } var passwordVisible by remember { mutableStateOf(false) } var showForgotPassword by remember { mutableStateOf(false) } var isLoading by remember { mutableStateOf(false) } val scrollState = rememberScrollState() val context = LocalContext.current AppBackground { Box( modifier = Modifier .fillMaxSize() .padding(24.dp) ) { Column( modifier = Modifier .fillMaxSize() .verticalScroll(scrollState), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { if (!showForgotPassword) { Text( text = "Welcome back", fontSize = 32.sp, fontWeight = FontWeight.Bold, color = Color.White, textAlign = TextAlign.Start, modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(16.dp)) Text( text = "Continue your journey with purpose.", fontSize = 18.sp, color = Color.Gray, textAlign = TextAlign.Start, modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(48.dp)) // Email Field OutlinedTextField( value = email, onValueChange = { email = it }, placeholder = { Text("Email address", color = Color.Gray.copy(alpha = 0.5f)) }, leadingIcon = { Icon(Icons.Filled.Email, contentDescription = null, tint = Color.Gray) }, modifier = Modifier.fillMaxWidth(), colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = Color(0xFF6C63FF), unfocusedBorderColor = Color.Gray.copy(alpha = 0.3f), focusedContainerColor = Color.White.copy(alpha = 0.05f), unfocusedContainerColor = Color.White.copy(alpha = 0.05f), focusedTextColor = Color.White, unfocusedTextColor = Color.White ), shape = RoundedCornerShape(16.dp) ) Spacer(modifier = Modifier.height(16.dp)) // Password Field OutlinedTextField( value = password, onValueChange = { password = it }, placeholder = { Text("Password", color = Color.Gray.copy(alpha = 0.5f)) }, leadingIcon = { Icon(Icons.Filled.Lock, contentDescription = null, tint = Color.Gray) }, trailingIcon = { val icon = if (passwordVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff IconButton(onClick = { passwordVisible = !passwordVisible }) { Icon(imageVector = icon, contentDescription = null, tint = Color.Gray) } }, visualTransformation = if (passwordVisible) androidx.compose.ui.text.input.VisualTransformation.None else PasswordVisualTransformation(), modifier = Modifier.fillMaxWidth(), colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = Color(0xFF6C63FF), unfocusedBorderColor = Color.Gray.copy(alpha = 0.3f), focusedContainerColor = Color.White.copy(alpha = 0.05f), unfocusedContainerColor = Color.White.copy(alpha = 0.05f), focusedTextColor = Color.White, unfocusedTextColor = Color.White ), shape = RoundedCornerShape(16.dp), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) ) // Forgot Password Link Box( modifier = Modifier .fillMaxWidth() .padding(top = 12.dp), contentAlignment = Alignment.CenterEnd ) { Text( text = "Forgot Password?", color = Color(0xFF5B89F7), fontSize = 14.sp, fontWeight = FontWeight.Medium, modifier = Modifier.clickable { showForgotPassword = true } ) } Spacer(modifier = Modifier.height(32.dp)) // Action Button PrimaryButton( text = "Log In", isLoading = isLoading, onClick = { if (email.isNotBlank() && password.isNotBlank()) { isLoading = true val request = LoginRequest(email, password) RetrofitClient.instance.loginUser(request).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { isLoading = false if (response.isSuccessful && response.body() != null) { val user = response.body()!! Toast.makeText(context, "Login successful", Toast.LENGTH_SHORT).show() onLoginSuccess( user.userId.toString(), user.username, user.identity ?: "Student", user.identityStatement ?: "" ) } else { Toast.makeText(context, "Invalid email or password", Toast.LENGTH_SHORT).show() } } override fun onFailure(call: Call, t: Throwable) { isLoading = false Toast.makeText(context, "Invalid email or password", Toast.LENGTH_SHORT).show() } }) } }, modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(24.dp)) // Toggle to Signup Box( modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center ) { Text( text = "New here? Create Account", color = Color(0xFF5B89F7), fontSize = 14.sp, fontWeight = FontWeight.Medium, modifier = Modifier.clickable { onNavigateToSignup() } ) } Spacer(modifier = Modifier.height(32.dp)) // OR Divider Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { HorizontalDivider(modifier = Modifier.weight(1f), color = GlassBorder) Text( text = "or", color = TextSecondary, modifier = Modifier.padding(horizontal = 16.dp), style = MaterialTheme.typography.labelSmall ) HorizontalDivider(modifier = Modifier.weight(1f), color = GlassBorder) } Spacer(modifier = Modifier.height(32.dp)) // Continue as Guest Button GlassButton( text = "Continue as Guest", onClick = { onLoginSuccess("guest_user", "Guest", "Champion", "I am a champion of my own life.") }, modifier = Modifier.fillMaxWidth() ) } else { PasswordResetFlow( onBackToLogin = { showForgotPassword = false }, onComplete = { showForgotPassword = false } ) } } } } }