package com.craigvg.lichun_android.ui.screens.dating.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.craigvg.lichun_android.domain.models.Person import com.craigvg.lichun_android.ui.theme.AppColors import com.craigvg.lichun_android.ui.theme.AppSpacing import com.craigvg.lichun_android.ui.theme.AppTypography import kotlin.math.abs /** * Modal explaining compatibility score breakdown * Ported from iOS CompatibilityExplanationView.swift */ @Composable fun CompatibilityExplanationView( person: Person, currentPerson: Person, onDismiss: () -> Unit ) { val sharedInterests = person.interests.filter { interest -> currentPerson.interests.any { it.equals(interest, ignoreCase = true) } } val ageDifference = abs(person.ageYears - currentPerson.ageYears) val ageDifferenceText = when { ageDifference == 0 -> "Same age" ageDifference == 1 -> "1 year age difference" else -> "$ageDifference years age difference" } val statsSimilarity = run { val healthDiff = abs(person.health.toInt() - currentPerson.health.toInt()) val happinessDiff = abs(person.happiness - currentPerson.happiness) val intelligenceDiff = abs(person.intelligence - currentPerson.intelligence) val prestigeDiff = abs(person.prestige - currentPerson.prestige) val avgDiff = (healthDiff + happinessDiff + intelligenceDiff + prestigeDiff) / 4 (100 - avgDiff).coerceAtLeast(0) } Column( modifier = Modifier .fillMaxWidth() .background( Brush.linearGradient( colors = listOf( AppColors.primary.copy(alpha = 0.05f), AppColors.accent.copy(alpha = 0.03f), Color.Transparent ) ) ) .background(AppColors.background) .padding(AppSpacing.xl) ) { // Close button Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) { IconButton( onClick = onDismiss, modifier = Modifier .size(32.dp) .clip(CircleShape) .background(AppColors.secondaryText.copy(alpha = 0.1f)) ) { Icon( imageVector = Icons.Default.Close, contentDescription = "Close", tint = AppColors.secondaryText, modifier = Modifier.size(14.dp) ) } } // Header Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally ) { Box( modifier = Modifier .size(80.dp) .clip(CircleShape) .background( Brush.linearGradient( colors = listOf( AppColors.primary.copy(alpha = 0.2f), AppColors.accent.copy(alpha = 0.15f) ) ) ), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.Favorite, contentDescription = null, tint = AppColors.primary, modifier = Modifier.size(48.dp) ) } Spacer(modifier = Modifier.height(AppSpacing.sm)) Text( text = "Why ${person.compatibilityScore}%?", style = AppTypography.title, color = AppColors.primaryText ) Text( text = "Compatibility is based on multiple factors", style = AppTypography.body, color = AppColors.secondaryText, textAlign = TextAlign.Center ) } Spacer(modifier = Modifier.height(AppSpacing.md)) HorizontalDivider(color = AppColors.secondaryText.copy(alpha = 0.2f)) Spacer(modifier = Modifier.height(AppSpacing.md)) // Factors Column(verticalArrangement = Arrangement.spacedBy(AppSpacing.sm)) { if (sharedInterests.isNotEmpty()) { ExplanationRow( icon = Icons.Default.Star, text = "${sharedInterests.size} shared interest${if (sharedInterests.size == 1) "" else "s"}", detail = sharedInterests.take(3).joinToString(", "), positive = true, impact = sharedInterests.size * 10 ) } ExplanationRow( icon = Icons.Default.CalendarToday, text = ageDifferenceText, detail = if (ageDifference <= 5) "Close in age" else "Larger age gap", positive = ageDifference <= 5, impact = if (ageDifference <= 5) 15 else -10 ) ExplanationRow( icon = Icons.Default.BarChart, text = "Similar life stats", detail = "$statsSimilarity% similarity across stats", positive = statsSimilarity >= 70, impact = if (statsSimilarity >= 70) 20 else 0 ) if (person.occupation.isNotEmpty() && currentPerson.occupation.isNotEmpty()) { val sameField = person.occupation.contains(currentPerson.occupation, ignoreCase = true) || currentPerson.occupation.contains(person.occupation, ignoreCase = true) ExplanationRow( icon = Icons.Default.Work, text = if (sameField) "Similar career paths" else "Different career paths", detail = "${person.occupation} / ${currentPerson.occupation}", positive = sameField, impact = if (sameField) 10 else 0 ) } ExplanationRow( icon = Icons.Default.AutoAwesome, text = "Mystery factor", detail = "Some things just click!", positive = person.compatibilityScore >= 70, impact = (5..15).random() ) } Spacer(modifier = Modifier.height(AppSpacing.lg)) // Close button Button( onClick = onDismiss, modifier = Modifier .fillMaxWidth() .height(AppSpacing.buttonHeight), shape = RoundedCornerShape(AppSpacing.cornerRadius), colors = ButtonDefaults.buttonColors(containerColor = AppColors.primary) ) { Text("Got it!", style = AppTypography.headline, color = Color.White) } } } @Composable private fun ExplanationRow( icon: androidx.compose.ui.graphics.vector.ImageVector, text: String, detail: String, positive: Boolean, impact: Int ) { val statusColor = if (positive) AppColors.success else AppColors.warning val impactColor = when { impact > 0 -> AppColors.success impact < 0 -> AppColors.error else -> AppColors.secondaryText } Row( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(AppSpacing.smallCornerRadius)) .background(AppColors.surfaceElevated) .background( Brush.horizontalGradient( colors = listOf(statusColor.copy(alpha = 0.05f), Color.Transparent) ) ) .padding(AppSpacing.sm), verticalAlignment = Alignment.Top, horizontalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { Box( modifier = Modifier .size(32.dp) .clip(CircleShape) .background(statusColor.copy(alpha = 0.15f)), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = null, tint = statusColor, modifier = Modifier.size(16.dp) ) } Column(modifier = Modifier.weight(1f)) { Text(text = text, style = AppTypography.bodyBold, color = AppColors.primaryText) Text(text = detail, style = AppTypography.caption, color = AppColors.secondaryText) } if (impact != 0) { Text( text = "${if (impact > 0) "+" else ""}$impact", style = AppTypography.captionBold, color = impactColor, modifier = Modifier .clip(RoundedCornerShape(8.dp)) .background(impactColor.copy(alpha = 0.15f)) .padding(horizontal = AppSpacing.sm, vertical = 4.dp) ) } } }