// src/main/kotlin/ui/PeriodTrendCard.kt (신규/통합) package ui import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.* import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import model.CandleData @Composable fun PeriodTrendCard(label: String, data: List, modifier: Modifier = Modifier) { val avgPrice = if (data.isEmpty()) "0" else String.format("%,d", data.map { it.stck_clpr.toDoubleOrNull() ?: 0.0 }.average().toLong()) Card(modifier = modifier.height(80.dp), elevation = 2.dp, backgroundColor = Color.White) { Row(modifier = Modifier.padding(8.dp), verticalAlignment = Alignment.CenterVertically) { // [좌측] 라벨 및 평균가 Column(modifier = Modifier.weight(0.4f)) { Text(label, fontSize = 10.sp, color = Color.Gray) Text(text = "${avgPrice}원", fontSize = 12.sp, fontWeight = FontWeight.Bold) } // [우측] 간소화된 그래프 (Sparkline) Box(modifier = Modifier.weight(0.6f).fillMaxHeight()) { if (data.isNotEmpty()) { Canvas(modifier = Modifier.fillMaxSize()) { val prices = data.map { it.stck_clpr.toDoubleOrNull() ?: 0.0 } val max = prices.maxOrNull() ?: 1.0 val min = prices.minOrNull() ?: 0.0 val range = if (max == min) 1.0 else max - min val stepX = size.width / (prices.size - 1).coerceAtLeast(1) val points = prices.mapIndexed { i, p -> Offset(i * stepX, (size.height - ((p - min) / range * size.height)).toFloat()) } for (i in 0 until points.size - 1) { drawLine( color = if (prices.last() >= prices.first()) Color(0xFFE03E2D) else Color(0xFF0E62CF), start = points[i], end = points[i + 1], strokeWidth = 2f ) } } } } } } }