package ui import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.Button import androidx.compose.material.Card import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Divider import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import model.KisSession import service.AutoTradingManager import service.TradingDecisionCallback @Composable fun AiAnalysisView(stockCode:String,stockName: String, currentPrice: String, trades: List, tradingDecisionCallback: TradingDecisionCallback) { var aiOpinion by remember { mutableStateOf("분석 대기 중...") } var code by remember(stockCode) { aiOpinion = "" mutableStateOf(stockCode.isNotEmpty()) } var isAnalyzing by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() // KisSession의 전역 설정을 참조 val isModelConfigured = remember(KisSession.config.modelPath) { val path = KisSession.config.modelPath path.isNotEmpty() && java.io.File(path).exists() } Card( elevation = 2.dp, backgroundColor = if (isModelConfigured) Color(0xFFF1F3F4) else Color(0xFFFFEBEE), modifier = Modifier.fillMaxWidth() ) { Column(modifier = Modifier .fillMaxHeight() .fillMaxWidth() .verticalScroll(rememberScrollState()) // 스크롤 활성화 .padding(16.dp) .background(Color(0xFFF5F5F5), RoundedCornerShape(8.dp))) { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = if (isModelConfigured) "${stockName} AI 투자 전략" else "⚠️ AI 설정 필요", fontWeight = FontWeight.Bold, color = if (isModelConfigured) Color(0xFF1A73E8) else Color.Red ) Spacer(Modifier.weight(1f)) Button( onClick = { scope.launch { isAnalyzing = true try { AutoTradingManager.addStock(stockName,stockCode) { decision,success -> aiOpinion = decision.toString() isAnalyzing = !success tradingDecisionCallback.invoke(decision,success) } } catch (e: Exception) { aiOpinion = "분석 중 오류 발생: ${e.message}" println(aiOpinion) isAnalyzing = false } finally { // isAnalyzing = false } } }, enabled = !isAnalyzing && code ) { if (isAnalyzing) { CircularProgressIndicator(modifier = Modifier.size(20.dp), color = Color.White) Spacer(Modifier.width(8.dp)) Text("뉴스 분석 중...") } else { Text("분석 요청") } } } Divider(Modifier.padding(vertical = 8.dp)) Text(text = aiOpinion, style = MaterialTheme.typography.body2) } } }