atrade/src/main/kotlin/ui/AiAnalysisView.kt

105 lines
4.4 KiB
Kotlin
Raw Normal View History

2026-01-10 18:16:50 +09:00
package ui
2026-01-22 16:21:18 +09:00
import androidx.compose.foundation.background
2026-01-10 18:16:50 +09:00
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.*
2026-01-22 16:21:18 +09:00
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
2026-01-10 18:16:50 +09:00
import androidx.compose.material.Button
import androidx.compose.material.Card
2026-01-21 18:59:55 +09:00
import androidx.compose.material.CircularProgressIndicator
2026-01-10 18:16:50 +09:00
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
2026-01-13 16:04:25 +09:00
import model.KisSession
2026-01-22 16:21:18 +09:00
import service.AutoTradingManager
2026-01-10 18:16:50 +09:00
@Composable
2026-01-22 16:21:18 +09:00
fun AiAnalysisView(stockCode:String,stockName: String, currentPrice: String, trades: List<model.RealTimeTrade>) {
2026-01-10 18:16:50 +09:00
var aiOpinion by remember { mutableStateOf("분석 대기 중...") }
2026-01-22 16:21:18 +09:00
var code by remember(stockCode) {
2026-01-22 17:56:31 +09:00
aiOpinion = ""
2026-01-22 16:21:18 +09:00
mutableStateOf(stockCode.isNotEmpty())
}
2026-01-21 18:59:55 +09:00
var isAnalyzing by remember { mutableStateOf(false) }
2026-01-10 18:16:50 +09:00
val scope = rememberCoroutineScope()
2026-01-13 16:04:25 +09:00
// KisSession의 전역 설정을 참조
val isModelConfigured = remember(KisSession.config.modelPath) {
val path = KisSession.config.modelPath
2026-01-10 18:16:50 +09:00
path.isNotEmpty() && java.io.File(path).exists()
}
Card(
elevation = 2.dp,
2026-01-13 16:04:25 +09:00
backgroundColor = if (isModelConfigured) Color(0xFFF1F3F4) else Color(0xFFFFEBEE),
modifier = Modifier.fillMaxWidth()
2026-01-10 18:16:50 +09:00
) {
2026-01-22 16:21:18 +09:00
Column(modifier = Modifier
.fillMaxHeight()
.fillMaxWidth()
.verticalScroll(rememberScrollState()) // 스크롤 활성화
.padding(16.dp)
.background(Color(0xFFF5F5F5), RoundedCornerShape(8.dp))) {
2026-01-10 18:16:50 +09:00
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
2026-01-22 16:21:18 +09:00
text = if (isModelConfigured) "${stockName} AI 투자 전략" else "⚠️ AI 설정 필요",
2026-01-10 18:16:50 +09:00
fontWeight = FontWeight.Bold,
color = if (isModelConfigured) Color(0xFF1A73E8) else Color.Red
)
Spacer(Modifier.weight(1f))
Button(
onClick = {
scope.launch {
2026-01-21 18:59:55 +09:00
isAnalyzing = true
try {
2026-01-22 16:21:18 +09:00
AutoTradingManager.addStock(stockCode) { msg,success ->
aiOpinion = msg
isAnalyzing = !success
}
2026-01-21 18:59:55 +09:00
// 실시간 데이터 수집부터 분석까지 한 번에 실행
2026-01-22 16:21:18 +09:00
// StockAnalysisManager.analyzeStockWithMultiData(
// stockCode = stockCode,
// stockName = stockName,
// result = {
// aiOpinion = it
// }
// )
2026-01-21 18:59:55 +09:00
} catch (e: Exception) {
aiOpinion = "분석 중 오류 발생: ${e.message}"
2026-01-22 16:21:18 +09:00
println(aiOpinion)
2026-01-21 18:59:55 +09:00
isAnalyzing = false
2026-01-22 16:21:18 +09:00
} finally {
// isAnalyzing = false
2026-01-21 18:59:55 +09:00
}
2026-01-10 18:16:50 +09:00
}
},
2026-01-22 16:21:18 +09:00
enabled = !isAnalyzing && code
2026-01-10 18:16:50 +09:00
) {
2026-01-21 18:59:55 +09:00
if (isAnalyzing) {
CircularProgressIndicator(modifier = Modifier.size(20.dp), color = Color.White)
Spacer(Modifier.width(8.dp))
Text("뉴스 분석 중...")
} else {
2026-01-22 16:21:18 +09:00
Text("분석 요청")
2026-01-21 18:59:55 +09:00
}
2026-01-10 18:16:50 +09:00
}
}
2026-01-13 16:04:25 +09:00
Divider(Modifier.padding(vertical = 8.dp))
Text(text = aiOpinion, style = MaterialTheme.typography.body2)
2026-01-10 18:16:50 +09:00
}
}
}