package network

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import model.RealTimeTrade

object AiService {
    private val client = HttpClient(CIO) {
        install(ContentNegotiation) {
            json(Json {
                ignoreUnknownKeys = true
                coerceInputValues = true
            })
        }
    }

    private const val LLM_URL = "http://localhost:8080/completion"

    /**
     * 종목명, 현재가, 실시간 체결내역을 바탕으로 AI 분석 결과를 가져옵니다.
     */
    suspend fun fetchAnalysis(
        stockName: String,
        currentPrice: String,
        trades: List<RealTimeTrade>
    ): String {
        // 최근 체결 내역 10개를 텍스트로 요약
        val tradeSummary = trades.take(10).joinToString("\n") { trade ->
            "- ${trade.time}: ${trade.price}원 (${trade.volume}주 ${if (trade.type.name == "BUY") "매수" else "매도"})"
        }

        // Gemma에게 전달할 프롬프트 구성
        val prompt = """
            <start_of_turn>user
            당신은 20년 경력의 전문 주식 트레이더이자 데이터 분석가입니다. 
            다음 데이터를 바탕으로 해당 종목의 현재 '수급 상황'과 '단기 전망'을 분석하여 3줄 이내로 핵심만 말해주세요.

            [종목 정보]
            - 종목명: $stockName
            - 현재가: $currentPrice
            
            [최근 실시간 체결 내역]
            $tradeSummary

            분석 기준:
            1. 매수 체결 비중이 높은지, 매도 체결 비중이 높은지 판단하세요.
            2. 대량 체결(고래)의 움직임이 있는지 확인하세요.
            3. 단기적으로 진입하기에 적절한 시점인지 조언하세요.
            
            답변은 한국어로, 친절하지만 단호한 전문가 말투를 사용하세요.<end_of_turn>
            <start_of_turn>model
            
        """.trimIndent()

        return try {
            val response = client.post(LLM_URL) {
                contentType(ContentType.Application.Json)
                setBody(LlamaRequest(prompt = prompt))
            }

            if (response.status == HttpStatusCode.OK) {
                val result: LlamaResponse = response.body()
                result.content.trim()
            } else {
                "AI 서버 응답 오류: ${response.status}"
            }
        } catch (e: Exception) {
            "분석 실패: 로컬 AI 서버(llama.cpp)가 실행 중인지 확인하세요. (${e.message})"
        }
    }
}

/**
 * llama.cpp 서버 요청 데이터 구조
 */
@Serializable
data class LlamaRequest(
    val prompt: String,
    val n_predict: Int = 256,
    val temperature: Double = 0.7,
    val stop: List<String> = listOf("<|end_of_turn|>", "<end_of_turn>")
)

/**
 * llama.cpp 서버 응답 데이터 구조
 */
@Serializable
data class LlamaResponse(
    val content: String
)