package com.craigvg.lichun_android.ui.screens.monetization import androidx.compose.foundation.background import androidx.compose.foundation.layout.* 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.* 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.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import com.craigvg.lichun_android.domain.models.TimeSkipEvent import com.craigvg.lichun_android.domain.models.TimeSkipSummary 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.GameStateViewModel /** * Time skip summary view showing simulated events * Ported from iOS TimeSkipSummaryView.swift */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun TimeSkipSummaryScreen( summary: TimeSkipSummary?, gameStateViewModel: GameStateViewModel = hiltViewModel(), onDismiss: () -> Unit = {} ) { Box( modifier = Modifier .fillMaxSize() .background( Brush.linearGradient( colors = listOf(AppColors.background, AppColors.surfaceSubtle) ) ) ) { LazyColumn( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally ) { // Header item { Column( modifier = Modifier.padding(top = AppSpacing.xl), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(AppSpacing.sm) ) { Box( modifier = Modifier .size(100.dp) .clip(CircleShape) .background(AppColors.secondary.copy(alpha = 0.2f)), contentAlignment = Alignment.Center ) { Icon( imageVector = Icons.Default.FastForward, contentDescription = null, tint = AppColors.secondary, modifier = Modifier.size(50.dp) ) } Text( text = "Time Skipped!", style = AppTypography.title, color = AppColors.primaryText ) summary?.let { Text( text = "Advanced ${it.durationHours.toInt()} hours", style = AppTypography.body, color = AppColors.secondaryText ) } } Spacer(modifier = Modifier.height(AppSpacing.lg)) } // Stat Changes Grid summary?.let { s -> item { StatChangesGrid( changes = s.statChanges, modifier = Modifier.padding(horizontal = AppSpacing.md) ) Spacer(modifier = Modifier.height(AppSpacing.lg)) } // Events if (s.events.isNotEmpty()) { item { Text( text = "What Happened", style = AppTypography.headline, color = AppColors.primaryText, modifier = Modifier .fillMaxWidth() .padding(horizontal = AppSpacing.md) ) Spacer(modifier = Modifier.height(AppSpacing.md)) } items(s.events) { event -> EventRow(event = event) Spacer(modifier = Modifier.height(AppSpacing.sm)) } } } // Continue button item { Spacer(modifier = Modifier.height(AppSpacing.lg)) Button( onClick = onDismiss, modifier = Modifier .fillMaxWidth() .padding(horizontal = AppSpacing.md) .height(AppSpacing.buttonHeight), shape = RoundedCornerShape(AppSpacing.cornerRadius), colors = ButtonDefaults.buttonColors( containerColor = AppColors.primary ) ) { Text( text = "Continue", style = AppTypography.headline, color = Color.White ) } Spacer(modifier = Modifier.height(AppSpacing.xl)) } } } } @Composable private fun StatChangesGrid( changes: TimeSkipSummary.StatChanges, modifier: Modifier = Modifier ) { Column( modifier = modifier, verticalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { Row( horizontalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { StatChangeCard( icon = Icons.Default.AttachMoney, label = "Money", value = changes.money.toInt(), color = AppColors.money, modifier = Modifier.weight(1f) ) StatChangeCard( icon = Icons.Default.Bolt, label = "Energy", value = changes.energy, color = AppColors.energy, modifier = Modifier.weight(1f) ) } Row( horizontalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { StatChangeCard( icon = Icons.Default.Favorite, label = "Health", value = changes.health, color = AppColors.health, modifier = Modifier.weight(1f) ) StatChangeCard( icon = Icons.Default.SentimentVerySatisfied, label = "Happiness", value = changes.happiness, color = AppColors.happiness, modifier = Modifier.weight(1f) ) } } } @Composable private fun StatChangeCard( icon: ImageVector, label: String, value: Int, color: Color, modifier: Modifier = Modifier ) { val changeColor = if (value >= 0) AppColors.success else AppColors.error val displayValue = if (value >= 0) "+$value" else "$value" Card( modifier = modifier, shape = RoundedCornerShape(AppSpacing.cornerRadius), colors = CardDefaults.cardColors( containerColor = color.copy(alpha = 0.1f) ), border = androidx.compose.foundation.BorderStroke( 1.dp, color.copy(alpha = 0.3f) ) ) { Column( modifier = Modifier .fillMaxWidth() .padding(AppSpacing.md), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(AppSpacing.xs) ) { Icon( imageVector = icon, contentDescription = null, tint = color, modifier = Modifier.size(28.dp) ) Text( text = displayValue, fontSize = 24.sp, fontWeight = FontWeight.Bold, color = changeColor ) Text( text = label, style = AppTypography.caption, color = AppColors.secondaryText ) } } } @Composable private fun EventRow(event: TimeSkipEvent) { val (icon, iconColor) = when (event.type) { "work" -> Icons.Default.Work to AppColors.money "school" -> Icons.Default.MenuBook to AppColors.intelligence "summary" -> Icons.Default.BarChart to AppColors.secondary else -> Icons.Default.Circle to AppColors.secondary } Card( modifier = Modifier .fillMaxWidth() .padding(horizontal = AppSpacing.md), shape = RoundedCornerShape(AppSpacing.smallCornerRadius), colors = CardDefaults.cardColors( containerColor = AppColors.surfaceElevated ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Row( modifier = Modifier .fillMaxWidth() .padding(AppSpacing.md), horizontalArrangement = Arrangement.spacedBy(AppSpacing.md), verticalAlignment = Alignment.CenterVertically ) { // Icon Box( modifier = Modifier .size(44.dp) .clip(CircleShape) .background(iconColor.copy(alpha = 0.15f)), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = null, tint = iconColor, modifier = Modifier.size(20.dp) ) } // Content Column( modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(4.dp) ) { Text( text = event.description, style = AppTypography.body, color = AppColors.primaryText ) Row( horizontalArrangement = Arrangement.spacedBy(AppSpacing.sm) ) { event.moneyEarned?.takeIf { it > 0 }?.let { money -> Row( horizontalArrangement = Arrangement.spacedBy(2.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = Icons.Default.AttachMoney, contentDescription = null, tint = AppColors.money, modifier = Modifier.size(12.dp) ) Text( text = "+$money", style = AppTypography.caption, color = AppColors.money ) } } event.smartsGained?.takeIf { it > 0 }?.let { smarts -> Row( horizontalArrangement = Arrangement.spacedBy(2.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = Icons.Default.Psychology, contentDescription = null, tint = AppColors.intelligence, modifier = Modifier.size(12.dp) ) Text( text = "+$smarts", style = AppTypography.caption, color = AppColors.intelligence ) } } } } } } }