package com.craigvg.lichun_android.domain.models import com.craigvg.lichun_android.utils.WebSocketCommands import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.contentOrNull @Serializable data class EventV2Choice( val choiceId: String, val text: String, val energyCost: Int? = null, val moneyCost: Double? = null, val diamondCost: Int? = null ) @Serializable data class EventV2Resources( val energy: Double? = null, val money: Double? = null, val diamonds: Double? = null ) @Serializable data class EventV2Effects( val stats: Map? = null, val resources: EventV2Resources? = null ) @Serializable data class EventV2Metadata( val category: String? = null, val status: String? = null, val kind: String? = null, val choiceId: String? = null ) @Serializable data class EventV2PromptEnvelope( val type: String, val eventId: String, val instanceId: String, val prompt: String, val choices: List, val metadata: EventV2Metadata? = null ) @Serializable data class EventV2ResolvedEnvelope( val type: String, val eventId: String, val instanceId: String, val resolutionText: String, val effects: EventV2Effects? = null, val metadata: EventV2Metadata? = null ) @Serializable data class EventV2ErrorEnvelope( val type: String, val code: String, val message: String, val eventId: String? = null, val instanceId: String? = null ) sealed class EventV2Envelope { data class Prompt(val value: EventV2PromptEnvelope) : EventV2Envelope() data class Resolved(val value: EventV2ResolvedEnvelope) : EventV2Envelope() data class Error(val value: EventV2ErrorEnvelope) : EventV2Envelope() } fun parseEventV2Envelope( payload: JsonObject, parserJson: Json = Json { ignoreUnknownKeys = true } ): EventV2Envelope? { val type = payload["type"]?.jsonPrimitive?.contentOrNull ?: return null return when (type) { "event_prompt" -> EventV2Envelope.Prompt( parserJson.decodeFromJsonElement(payload) ) "event_resolved" -> EventV2Envelope.Resolved( parserJson.decodeFromJsonElement(payload) ) "event_error" -> EventV2Envelope.Error( parserJson.decodeFromJsonElement(payload) ) else -> null } } fun buildEventResponsePayload(eventId: String, choiceId: String): Map = WebSocketCommands.eventResponse(eventId = eventId, choiceId = choiceId)