package com.craigvg.lichun_android.ui.components.images import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text 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.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.SubcomposeAsyncImage import coil3.request.ImageRequest import coil3.request.crossfade import coil3.svg.SvgDecoder import com.craigvg.lichun_android.ui.theme.AppColors @Composable fun CharacterAvatar( imageUrl: String = "", firstName: String, lastName: String = "", modifier: Modifier = Modifier, size: Dp = 48.dp, showBorder: Boolean = true, showGlow: Boolean = true, borderGradient: List = listOf(AppColors.primary, AppColors.accent) ) { val initial = if (firstName.isNotEmpty()) firstName.first().uppercaseChar().toString() else "?" val fontSize = (size.value * 0.4f).sp val borderWidth = if (size > 80.dp) 3.dp else 2.dp val baseModifier = modifier .size(size) .clip(CircleShape) .then( if (showBorder) { Modifier.border(borderWidth, Brush.linearGradient(borderGradient), CircleShape) } else Modifier ) .then( if (showGlow) { Modifier.shadow( elevation = if (size > 80.dp) 12.dp else 8.dp, shape = CircleShape, ambientColor = borderGradient.firstOrNull()?.copy(alpha = 0.2f) ?: Color.Transparent, spotColor = borderGradient.firstOrNull()?.copy(alpha = 0.2f) ?: Color.Transparent ) } else Modifier ) if (imageUrl.isNotEmpty()) { SubcomposeAsyncImage( model = ImageRequest.Builder(LocalContext.current) .data(imageUrl) .decoderFactory(SvgDecoder.Factory()) .crossfade(true) .build(), contentDescription = "$firstName $lastName avatar", contentScale = ContentScale.Crop, modifier = baseModifier, loading = { AvatarPlaceholder( initial = initial, fontSize = fontSize, borderGradient = borderGradient, showLoading = true ) }, error = { AvatarPlaceholder( initial = initial, fontSize = fontSize, borderGradient = borderGradient ) } ) } else { Box(modifier = baseModifier) { AvatarPlaceholder( initial = initial, fontSize = fontSize, borderGradient = borderGradient ) } } } @Composable private fun AvatarPlaceholder( initial: String, fontSize: androidx.compose.ui.unit.TextUnit, borderGradient: List, showLoading: Boolean = false ) { Box( modifier = Modifier .background( Brush.linearGradient( listOf( AppColors.surfaceElevated, AppColors.cardBackground ) ) ), contentAlignment = Alignment.Center ) { Text( text = initial, color = borderGradient.firstOrNull() ?: AppColors.primary, fontSize = fontSize, fontWeight = FontWeight.Bold ) if (showLoading) { CircularProgressIndicator( modifier = Modifier.size(24.dp), color = AppColors.primary, strokeWidth = 2.dp ) } } }