BattleSessionGateway.kt

package io.github.lishangbu.avalon.game.battle.engine.application.gateway

import io.github.lishangbu.avalon.game.battle.engine.core.model.BattleType
import io.github.lishangbu.avalon.game.battle.engine.core.model.UnitState
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionChoice
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionQuery
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionTurnResult

/**
 * BattleSession 内部网关接口。
 *
 * 设计意图:
 * - 为上层调用方提供稳定的会话 API。
 * - 屏蔽 BattleSession 内部装配、存储和查询细节。
 */
interface BattleSessionGateway {
    fun createSession(
        sessionId: String,
        formatId: String,
    ): BattleSessionQuery

    fun configureSession(
        sessionId: String,
        battleKind: BattleType,
        capturableSideId: String? = null,
    ): BattleSessionQuery

    fun startSession(sessionId: String): BattleSessionQuery

    fun registerSide(
        sessionId: String,
        sideId: String,
    ): BattleSessionQuery

    fun registerUnit(
        sessionId: String,
        sideId: String,
        unit: UnitState,
        active: Boolean = true,
    ): BattleSessionQuery

    fun submitChoice(
        sessionId: String,
        choice: BattleSessionChoice,
    ): BattleSessionQuery

    fun submitChoices(
        sessionId: String,
        choices: List<BattleSessionChoice>,
    ): BattleSessionQuery

    fun submitReplacementChoice(
        sessionId: String,
        sideId: String,
        incomingUnitId: String,
    ): BattleSessionQuery

    fun markSessionSettled(sessionId: String): BattleSessionQuery

    fun resolveTurn(sessionId: String): BattleSessionTurnResult

    fun querySession(sessionId: String): BattleSessionQuery
}