SmartBattleEffectImportService.kt

package io.github.lishangbu.avalon.game.service.effect

import io.github.lishangbu.avalon.dataset.api.model.AbilityInfo
import io.github.lishangbu.avalon.dataset.api.model.ItemInfo
import io.github.lishangbu.avalon.dataset.api.model.MoveInfo
import io.github.lishangbu.avalon.dataset.api.service.AbilityReader
import io.github.lishangbu.avalon.dataset.api.service.ItemReader
import io.github.lishangbu.avalon.dataset.api.service.MoveReader
import io.github.lishangbu.avalon.game.battle.engine.core.dsl.EffectDefinition
import org.springframework.stereotype.Service

/**
 * 基于真实数据源的战斗 effect 智能导入服务。
 */
@Service
class SmartBattleEffectImportService(
    private val moveReader: MoveReader,
    private val abilityReader: AbilityReader,
    private val itemReader: ItemReader,
) {
    fun importEffect(effectId: String): EffectDefinition? =
        loadMove(effectId)?.let(::toMoveRecord)?.let(SmartBattleEffectAssembler::fromMove)
            ?: loadAbility(effectId)?.let(::toAbilityRecord)?.let(SmartBattleEffectAssembler::fromAbility)
            ?: loadItem(effectId)?.let(::toItemRecord)?.let(SmartBattleEffectAssembler::fromItem)

    private fun loadMove(internalName: String): MoveInfo? = moveReader.findMoveByInternalName(internalName)

    private fun loadAbility(internalName: String): AbilityInfo? = abilityReader.findAbilityByInternalName(internalName)

    private fun loadItem(internalName: String): ItemInfo? = itemReader.findItemByInternalName(internalName)

    private fun toMoveRecord(move: MoveInfo): MoveImportRecord =
        MoveImportRecord(
            internalName = move.internalName,
            name = move.name,
            typeInternalName = move.typeInternalName,
            damageClassInternalName = move.damageClassInternalName,
            targetInternalName = move.targetInternalName,
            accuracy = move.accuracy,
            effectChance = move.effectChance,
            pp = move.pp,
            priority = move.priority,
            power = move.power,
            shortEffect = move.shortEffect,
            effect = move.effect,
            ailmentInternalName = move.ailmentInternalName,
            ailmentChance = move.ailmentChance,
            healing = move.healing,
            drain = move.drain,
        )

    private fun toAbilityRecord(ability: AbilityInfo): AbilityImportRecord =
        AbilityImportRecord(
            internalName = ability.internalName,
            name = ability.name,
            effect = ability.effect,
            introduction = ability.introduction,
        )

    private fun toItemRecord(item: ItemInfo): ItemImportRecord =
        ItemImportRecord(
            internalName = item.internalName,
            name = item.name,
            shortEffect = item.shortEffect,
            effect = item.effect,
            text = item.text,
            attributeInternalNames = item.attributeInternalNames,
            flingEffectInternalName = item.flingEffectInternalName,
        )
}