DefaultBattleSessionTurnReadySpecification.kt

package io.github.lishangbu.avalon.game.battle.engine.core.session.specification

import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSession

/**
 * 默认回合结算规格。
 *
 * 设计意图:
 * - 集中描述“当前回合何时允许进入 resolve”这一组规则。
 * - 保持无状态,便于作为 Spring 单例 Bean 复用。
 */
class DefaultBattleSessionTurnReadySpecification : BattleSessionTurnReadySpecification {
    /**
     * 校验当前回合是否已经满足最小结算条件。
     */
    override fun validate(session: BattleSession): BattleSessionValidationResult {
        val missingUnitIds = session.pendingChoiceUnitIds()
        if (missingUnitIds.isNotEmpty()) {
            return BattleSessionValidationResult.rejected(
                "Cannot resolve turn because these active units have not submitted actions: $missingUnitIds",
            )
        }
        if (session.replacementRequests.isNotEmpty()) {
            return BattleSessionValidationResult.rejected(
                "Cannot resolve turn while replacement requests are pending: ${session.replacementRequests}",
            )
        }
        return BattleSessionValidationResult.satisfied()
    }
}