import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import io.ktor.client.HttpClient
import io.ktor.client.engine.cio.CIO
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.logging.DEFAULT
import io.ktor.client.plugins.logging.LogLevel
import io.ktor.client.plugins.logging.Logger
import io.ktor.client.plugins.logging.Logging
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
import model.AppConfig
import model.KisSession
import network.DartCodeManager
import network.LlamaServerManager
import network.NewsService
import org.jetbrains.exposed.sql.selectAll
import ui.DashboardScreen
import ui.SettingsScreen

// 화면 상태 정의
enum class AppScreen { Settings, Dashboard }

fun main() = application {
    LaunchedEffect(Unit) {
        // NewsService나 KisTradeService에서 사용하는 client를 전달
        DartCodeManager.updateCorpCodes(HttpClient(CIO) {
            install(ContentNegotiation) {
                json(Json {
                    ignoreUnknownKeys = true
                    encodeDefaults = true // 기본값이 포함된 요청 바디를 정확히 전송하기 위해 필요
                })
            }
            // [수정] 모든 로그(Headers + Body)를 찍도록 설정
            install(Logging) {
                logger = Logger.DEFAULT
                level = LogLevel.BODY
            }
        })
    }
    // 앱 실행 시 필요한 바이너리 경로 (실행 파일 위치)
    val binPath = "./src/main/resources/bin/llama-server"
    val windowState = rememberWindowState(
        placement = WindowPlacement.Maximized
    )
    Window(onCloseRequest = ::exitApplication, title = "KIS AI 자동매매", state = windowState) {
        var currentScreen by remember { mutableStateOf(AppScreen.Settings) }
        var isLoaded by remember { mutableStateOf(false) }
        val scope = rememberCoroutineScope()

        // 1. 앱 시작 시 DB에서 마지막 설정 로드 (KisSession에 주입)
        LaunchedEffect(Unit) {
            DatabaseFactory.init()
            transaction {
                ConfigTable.selectAll().lastOrNull()?.let {
                    KisSession.config = AppConfig(
                        realAppKey = it[ConfigTable.realAppKey],
                        realSecretKey = it[ConfigTable.realSecretKey],
                        realAccountNo = it[ConfigTable.realAccountNo],
                        vtsAppKey = it[ConfigTable.vtsAppKey],
                        vtsSecretKey = it[ConfigTable.vtsSecretKey],
                        vtsAccountNo = it[ConfigTable.vtsAccountNo],
                        isSimulation = it[ConfigTable.isSimulation],
                        htsId = it[ConfigTable.htsId],
                        modelPath = it[ConfigTable.modelPath],
                        embedModelPath = it[ConfigTable.embedModelPath]
                    )
                }
            }

            isLoaded = true
        }

        if (!isLoaded) {
            // 로딩 중 표시
            CircularProgressIndicator()
        } else {
            when (currentScreen) {
                AppScreen.Settings -> {
                    SettingsScreen(
                        onAuthSuccess = {
                            // 2. 설정 및 인증 완료 시점의 처리
                            val config = KisSession.config

                            // LLM 서버 시작 (설정된 모델 경로 사용)
                            if (config.modelPath.isNotEmpty()) {
                                LlamaServerManager.startServer(binPath, config.modelPath,port = 8080)
                            }
                            if (config.embedModelPath.isNotEmpty()) {
                                LlamaServerManager.startServer(binPath, config.embedModelPath, port = 8081)
                            }

                            // 대시보드로 화면 전환
                            currentScreen = AppScreen.Dashboard
                        }
                    )
                }
                AppScreen.Dashboard -> {
                    DashboardScreen()
                }
            }
        }
    }
}