DefaultBattleSessionFactory.kt

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

import io.github.lishangbu.avalon.game.battle.engine.core.runtime.apply.MutationApplier
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleFlowEngine
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleFlowPhaseProcessor
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleMutationInterceptorChain
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSession
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionActionExecutionSupport
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionActionHandlerRegistry
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionActionSortingStrategy
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionChoiceHandlerRegistry
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionCommandFactory
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionEventPublisher
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionState
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionTurnPipeline
import io.github.lishangbu.avalon.game.battle.engine.core.session.ReplacementStrategy
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionCaptureChoiceSpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionItemChoiceSpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionMoveChoiceSpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionRunChoiceSpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionTargetChoiceSpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionTurnReadySpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.specification.BattleSessionUnitChoiceSpecification
import io.github.lishangbu.avalon.game.battle.engine.core.session.target.BattleSessionTargetQueryService
import io.github.lishangbu.avalon.game.battle.engine.spi.capture.CaptureActionResolver
import io.github.lishangbu.avalon.game.battle.engine.spi.effect.EffectDefinitionRepository

/**
 * 默认 BattleSession 工厂。
 *
 * 设计意图:
 * - 统一装配 battle flow、processor、mutation apply 和 replacement strategy。
 * - 为 gateway 与 application 层提供一个简单且稳定的 session 创建入口。
 */
class DefaultBattleSessionFactory(
    private val effectRepository: EffectDefinitionRepository,
    private val battleFlowEngine: BattleFlowEngine,
    private val battleFlowPhaseProcessor: BattleFlowPhaseProcessor,
    private val battleMutationInterceptorChain: BattleMutationInterceptorChain,
    private val captureActionResolver: CaptureActionResolver,
    private val mutationApplier: MutationApplier,
    private val replacementStrategy: ReplacementStrategy,
    private val actionExecutionSupport: BattleSessionActionExecutionSupport,
    private val choiceHandlerRegistry: BattleSessionChoiceHandlerRegistry,
    private val actionHandlerRegistry: BattleSessionActionHandlerRegistry,
    private val turnPipeline: BattleSessionTurnPipeline,
    private val turnReadySpecification: BattleSessionTurnReadySpecification,
    private val unitChoiceSpecification: BattleSessionUnitChoiceSpecification,
    private val runChoiceSpecification: BattleSessionRunChoiceSpecification,
    private val targetChoiceSpecification: BattleSessionTargetChoiceSpecification,
    private val captureChoiceSpecification: BattleSessionCaptureChoiceSpecification,
    private val moveChoiceSpecification: BattleSessionMoveChoiceSpecification,
    private val itemChoiceSpecification: BattleSessionItemChoiceSpecification,
    private val targetQueryService: BattleSessionTargetQueryService,
    private val actionSortingStrategy: BattleSessionActionSortingStrategy,
    private val eventPublisher: BattleSessionEventPublisher,
    private val commandFactory: BattleSessionCommandFactory,
) : BattleSessionFactory {
    override fun create(
        sessionId: String,
        formatId: String,
    ): BattleSession =
        BattleSession(
            effectRepository = effectRepository,
            battleFlowEngine = battleFlowEngine,
            battleFlowPhaseProcessor = battleFlowPhaseProcessor,
            mutationInterceptorChain = battleMutationInterceptorChain,
            mutationApplier = mutationApplier,
            replacementStrategy = replacementStrategy,
            captureActionResolver = captureActionResolver,
            actionExecutionSupport = actionExecutionSupport,
            choiceHandlerRegistry = choiceHandlerRegistry,
            actionHandlerRegistry = actionHandlerRegistry,
            turnPipeline = turnPipeline,
            turnReadySpecification = turnReadySpecification,
            unitChoiceSpecification = unitChoiceSpecification,
            runChoiceSpecification = runChoiceSpecification,
            targetChoiceSpecification = targetChoiceSpecification,
            captureChoiceSpecification = captureChoiceSpecification,
            moveChoiceSpecification = moveChoiceSpecification,
            itemChoiceSpecification = itemChoiceSpecification,
            targetQueryService = targetQueryService,
            actionSortingStrategy = actionSortingStrategy,
            eventPublisher = eventPublisher,
            commandFactory = commandFactory,
            battleId = sessionId,
            formatId = formatId,
        )

    override fun restore(state: BattleSessionState): BattleSession =
        create(
            sessionId = state.snapshot.battle.id,
            formatId = state.snapshot.battle.formatId,
        ).also { session ->
            session.restoreState(state)
        }
}