DefaultBattleSettlementExecutor.kt

package io.github.lishangbu.avalon.game.battle.settlement

import io.github.lishangbu.avalon.game.battle.engine.application.BattleEngineService
import io.github.lishangbu.avalon.game.battle.engine.application.BattleSettlementPlan
import io.github.lishangbu.avalon.game.battle.engine.application.BattleSettlementTask
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionQuery
import io.github.lishangbu.avalon.game.capture.BattleCaptureSettlementService
import io.github.lishangbu.avalon.game.capture.CaptureBattleResult
import org.springframework.stereotype.Service

/**
 * 默认结算计划执行器。
 *
 * 设计意图:
 * - 让 engine 只负责规划任务,不直接碰真实副作用;
 * - 让 game 按照计划顺序统一执行库存扣减、落库和最终 settled 标记。
 */
@Service
class DefaultBattleSettlementExecutor(
    private val battleEngineService: BattleEngineService,
    private val battleCaptureSettlementService: BattleCaptureSettlementService,
) : BattleSettlementExecutor {
    override fun execute(plan: BattleSettlementPlan): BattleSettlementResult {
        var currentSession = plan.session
        var captureResult: CaptureBattleResult? = null

        plan.tasks.forEach { task ->
            when (task) {
                BattleSettlementTask.SETTLE_CAPTURE_LEDGER -> {
                    captureResult = battleCaptureSettlementService.settle(plan.sessionId, currentSession)
                }

                BattleSettlementTask.MARK_SESSION_SETTLED -> {
                    currentSession = battleEngineService.markSessionSettled(plan.sessionId)
                }
            }
        }

        return BattleSettlementResult(
            sessionId = plan.sessionId,
            endedReason = currentSession.snapshot.battle.endedReason,
            settled =
                currentSession.snapshot.battle.lifecycle
                    .isSettled(),
            session = currentSession,
            captureResult = captureResult,
        )
    }
}