DefaultBattleSessionUnitChoiceSpecification.kt

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

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

/**
 * 默认 active 单位行动提交规格。
 */
class DefaultBattleSessionUnitChoiceSpecification : BattleSessionUnitChoiceSpecification {
    /**
     * 校验某个 active 单位当前是否允许继续提交行动。
     */
    override fun validate(
        session: BattleSession,
        unitId: String,
    ): BattleSessionValidationResult {
        val side =
            session.currentSnapshot.sides.values
                .firstOrNull { candidate -> unitId in candidate.activeUnitIds }
                ?: return BattleSessionValidationResult.rejected(
                    "Unit '$unitId' is not currently active and cannot submit a turn action.",
                )

        val submittedUnitIds = session.submittedUnitIdsForSide(side)
        if (unitId in submittedUnitIds) {
            return BattleSessionValidationResult.rejected(
                "Unit '$unitId' has already submitted an action for turn ${session.currentSnapshot.battle.turn}.",
            )
        }
        return BattleSessionValidationResult.satisfied()
    }
}