LocalMoveReader.kt

package io.github.lishangbu.avalon.dataset.service.api

import io.github.lishangbu.avalon.dataset.api.model.MoveInfo
import io.github.lishangbu.avalon.dataset.api.service.MoveReader
import io.github.lishangbu.avalon.dataset.entity.dto.MoveSpecification
import io.github.lishangbu.avalon.dataset.entity.dto.MoveView
import io.github.lishangbu.avalon.dataset.repository.MoveRepository
import org.springframework.stereotype.Service

@Service
class LocalMoveReader(
    private val moveRepository: MoveRepository,
) : MoveReader {
    override fun findMoveByInternalName(internalName: String): MoveInfo? =
        moveRepository
            .listViews(MoveSpecification(internalName = internalName))
            .firstOrNull { move -> move.internalName == internalName }
            ?.toMoveInfo()

    override fun findMovesByInternalNames(internalNames: Set<String>): Map<String, MoveInfo> =
        internalNames
            .mapNotNull { internalName ->
                findMoveByInternalName(internalName)?.let { move -> internalName to move }
            }.toMap(LinkedHashMap())

    private fun MoveView.toMoveInfo(): MoveInfo =
        MoveInfo(
            id = id.toLong(),
            internalName = requireNotNull(internalName) { "Move id=$id is missing internalName." },
            name = name ?: requireNotNull(internalName),
            typeInternalName = type?.internalName,
            damageClassInternalName = moveDamageClass?.internalName,
            targetInternalName = moveTarget?.internalName,
            accuracy = accuracy,
            effectChance = effectChance,
            pp = pp,
            priority = priority,
            power = power,
            shortEffect = shortEffect,
            effect = effect,
            ailmentInternalName = moveAilment?.internalName,
            ailmentChance = ailmentChance,
            healing = healing,
            drain = drain,
        )
}