package com.craigvg.lichun_android.ui.screens.dating import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.* 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.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.craigvg.lichun_android.domain.models.DateActivity import com.craigvg.lichun_android.domain.models.Person import com.craigvg.lichun_android.ui.screens.dating.components.ActivityOptionCard 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 com.craigvg.lichun_android.viewmodel.PlayerViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle /** * Date activity selection screen * Ported from iOS DateActivitySelectionView.swift */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun DateActivitySelectionScreen( partner: Person, playerViewModel: PlayerViewModel = hiltViewModel(), onBack: () -> Unit = {}, onActivitySelected: (DateActivity) -> Unit = {} ) { val person by playerViewModel.person.collectAsStateWithLifecycle() val serverDateIdeas by playerViewModel.dateIdeas.collectAsStateWithLifecycle() LaunchedEffect(partner.id) { playerViewModel.fetchDateIdeas(partner.id) } var selectedActivity by remember { mutableStateOf(null) } var showAffordableOnly by remember { mutableStateOf(false) } val fallbackActivities = remember { listOf( DateActivity(id = "dinner", name = "Dinner", icon = "\uD83C\uDF7D\uFE0F", energyCost = 10, moneyCost = 0.0, diamondCost = 0, minAffinityGain = 3, maxAffinityGain = 8, premium = false, hasMiniGame = true, description = "Enjoy a nice meal together"), DateActivity(id = "movie", name = "Movie", icon = "\uD83C\uDFAC", energyCost = 15, moneyCost = 50.0, diamondCost = 0, minAffinityGain = 5, maxAffinityGain = 12, premium = false, hasMiniGame = true, description = "Watch a movie at the cinema"), DateActivity(id = "concert", name = "Concert", icon = "\uD83C\uDFB5", energyCost = 20, moneyCost = 100.0, diamondCost = 0, minAffinityGain = 8, maxAffinityGain = 15, premium = false, hasMiniGame = true, description = "Enjoy live music together"), DateActivity(id = "weekend_trip", name = "Weekend Trip", icon = "\uD83C\uDFD6\uFE0F", energyCost = 30, moneyCost = 200.0, diamondCost = 50, minAffinityGain = 15, maxAffinityGain = 25, premium = true, hasMiniGame = true, description = "Get away for the weekend"), DateActivity(id = "luxury_restaurant", name = "Luxury Restaurant", icon = "\uD83E\uDD42", energyCost = 15, moneyCost = 300.0, diamondCost = 75, minAffinityGain = 20, maxAffinityGain = 30, premium = true, hasMiniGame = true, description = "Fine dining experience"), DateActivity(id = "adventure", name = "Adventure", icon = "\uD83E\uDDD7", energyCost = 40, moneyCost = 80.0, diamondCost = 0, minAffinityGain = 10, maxAffinityGain = 18, premium = false, hasMiniGame = true, description = "Exciting outdoor activities") ) } val activities = if (serverDateIdeas.isNotEmpty()) { serverDateIdeas.map { idea -> DateActivity( id = idea.name.lowercase().replace(" ", "_"), name = idea.name, icon = idea.image, energyCost = idea.energy_cost, moneyCost = idea.money_cost, hasMiniGame = true ) } } else { fallbackActivities } fun canAfford(activity: DateActivity): Boolean { return person.calcEnergy >= activity.energyCost && person.money >= activity.moneyCost && person.diamonds >= activity.diamondCost } val filteredActivities = if (showAffordableOnly) { activities.filter { canAfford(it) } } else { activities } Box( modifier = Modifier .fillMaxSize() .background( Brush.linearGradient( colors = listOf( Color(0xFFFFE8F0).copy(alpha = 0.4f), AppColors.background, Color(0xFFF5E8FF).copy(alpha = 0.3f), AppColors.background ) ) ) ) { Column(modifier = Modifier.fillMaxSize()) { // Header Surface( color = AppColors.surfaceElevated.copy(alpha = 0.7f), modifier = Modifier.fillMaxWidth() ) { Column( modifier = Modifier.padding(AppSpacing.md), horizontalAlignment = Alignment.CenterHorizontally ) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { IconButton( onClick = onBack, modifier = Modifier .size(36.dp) .clip(CircleShape) .background(AppColors.surfaceElevated) ) { Icon( imageVector = Icons.Default.Close, contentDescription = "Close", tint = AppColors.secondaryText ) } Spacer(modifier = Modifier.weight(1f)) Column(horizontalAlignment = Alignment.CenterHorizontally) { Row( horizontalArrangement = Arrangement.spacedBy(AppSpacing.xs), verticalAlignment = Alignment.CenterVertically ) { Icon(imageVector = Icons.Default.Favorite, contentDescription = null, tint = AppColors.primary, modifier = Modifier.size(18.dp)) Text(text = "Choose Date Activity", style = AppTypography.title, color = AppColors.primaryText) Icon(imageVector = Icons.Default.Favorite, contentDescription = null, tint = AppColors.primary, modifier = Modifier.size(18.dp)) } Row( horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.CenterVertically ) { Text(text = "with", style = AppTypography.caption, color = AppColors.secondaryText) Text(text = partner.firstname, style = AppTypography.body, color = AppColors.primary) } } Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.size(36.dp)) } } } HorizontalDivider(color = AppColors.primary.copy(alpha = 0.2f)) // Filter toggle Row( modifier = Modifier .fillMaxWidth() .background( Brush.horizontalGradient( colors = listOf( AppColors.surfaceElevated.copy(alpha = 0.6f), AppColors.primary.copy(alpha = 0.05f) ) ) ) .padding(horizontal = AppSpacing.md, vertical = AppSpacing.md), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row( horizontalArrangement = Arrangement.spacedBy(AppSpacing.xs), verticalAlignment = Alignment.CenterVertically ) { Icon(imageVector = Icons.Default.AutoAwesome, contentDescription = null, tint = AppColors.accent, modifier = Modifier.size(14.dp)) Text(text = "Show affordable only", style = AppTypography.body, color = AppColors.primaryText) } Switch( checked = showAffordableOnly, onCheckedChange = { showAffordableOnly = it }, colors = SwitchDefaults.colors(checkedThumbColor = Color.White, checkedTrackColor = AppColors.primary) ) } // Activities grid LazyVerticalGrid( columns = GridCells.Fixed(2), contentPadding = PaddingValues(AppSpacing.md), horizontalArrangement = Arrangement.spacedBy(AppSpacing.md), verticalArrangement = Arrangement.spacedBy(AppSpacing.md), modifier = Modifier.fillMaxSize() ) { items(filteredActivities) { activity -> ActivityOptionCard( activity = activity, isSelected = selectedActivity?.id == activity.id, canAfford = canAfford(activity), onClick = { if (canAfford(activity)) { selectedActivity = activity onActivitySelected(activity) } } ) } } } } }