package com.craigvg.lichun_android.ui.screens.home.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* 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.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp 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 /** * Reusable character card with avatar, name, relationship tag * Ported from iOS CharacterCard.swift */ @Composable fun CharacterCard( person: Person, showStats: Boolean = false, avatarSize: Dp = 50.dp, onClick: () -> Unit = {} ) { Card( modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick), shape = RoundedCornerShape(AppSpacing.cornerRadius), colors = CardDefaults.cardColors(containerColor = AppColors.surfaceElevated) ) { Row( modifier = Modifier .fillMaxWidth() .padding(AppSpacing.sm), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(AppSpacing.sm) ) { // Avatar com.craigvg.lichun_android.ui.components.images.CharacterAvatar( imageUrl = person.image, firstName = person.firstname, lastName = person.lastname, size = avatarSize ) // Info column Column( modifier = Modifier.weight(1f) ) { Text( text = "${person.firstname} ${person.lastname}".trim(), style = AppTypography.bodyBold, color = AppColors.primaryText, maxLines = 1, overflow = TextOverflow.Ellipsis ) if (person.ageYears > 0) { Text( text = "Age ${person.ageYears}", style = AppTypography.caption, color = AppColors.secondaryText ) } // Relationship tag val relationship = person.relationships.firstOrNull() if (!relationship.isNullOrEmpty()) { Spacer(modifier = Modifier.height(4.dp)) Box( modifier = Modifier .clip(RoundedCornerShape(6.dp)) .background(relationshipColor(relationship).copy(alpha = 0.15f)) .padding(horizontal = 8.dp, vertical = 3.dp) ) { Text( text = relationship.replaceFirstChar { it.uppercase() }, style = AppTypography.caption, color = relationshipColor(relationship) ) } } } // Optional stat pills if (showStats) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(4.dp) ) { StatPill(value = person.affinity, color = AppColors.primary) StatPill(value = person.happiness, color = AppColors.happiness) } } // Chevron Icon( imageVector = Icons.Default.ChevronRight, contentDescription = null, tint = AppColors.disabledText, modifier = Modifier.size(20.dp) ) } } } @Composable private fun StatPill( value: Int, color: Color ) { Box( modifier = Modifier .clip(RoundedCornerShape(8.dp)) .background(color.copy(alpha = 0.15f)) .padding(horizontal = 6.dp, vertical = 2.dp) ) { Text( text = "$value", style = AppTypography.caption, color = color ) } } private fun relationshipColor(relationship: String): Color { return when { relationship.contains("boss") || relationship.contains("teacher") -> AppColors.prestige relationship.contains("coworker") || relationship.contains("classmate") -> AppColors.friend relationship.contains("partner") || relationship.contains("spouse") || relationship.contains("dating") -> AppColors.primary relationship.contains("parent") || relationship.contains("sibling") || relationship.contains("child") -> AppColors.secondary else -> AppColors.acquaintance } }