package com.dowstats.service.datamaps import com.dowstats.data.dto.controllers.RaceUnits import com.dowstats.data.dto.controllers.UnitDto import com.dowstats.data.entities.DowUnit import com.dowstats.data.entities.Race import com.dowstats.data.repositories.RaceRepository import com.dowstats.data.repositories.UnitRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service @Service class DowUnitMappingService @Autowired constructor( val unitRepository: UnitRepository, val raceRepository: RaceRepository ) { fun findUnitsByMod(modId: Long): List { val races = raceRepository.findRacesByMod(modId) return getAllUnits(modId).groupBy { it.race }.map {raceUnits -> toRaceUnitsDto(raceUnits.value, races.first { it.id == raceUnits.key?.id } ) } } fun findUnitsByModAndRace(modId: Long, race: String): RaceUnits { val units = getAllUnits(modId, race) val raceEntity = race.let{ raceRepository.findById(race) ?: throw Exception("Race $race not found") } return toRaceUnitsDto(units, raceEntity) } private fun toRaceUnitsDto(units: List, race: Race): RaceUnits { val infantry = units .filter { it.capInfantry?.let { it > 0 } ?: false || it.reinforceCostPopulation?.let { it > 0 } ?: false } .toUnitDto() val tech = units .filter { it.capSupport?.let { it > 0 } ?: false } .toUnitDto() val support = units.filter { it.capInfantry?.let { it == 0 } ?: false && it.reinforceCostPopulation?.let { it == 0 } ?: true && it.capSupport?.let { it == 0 } ?: false } .toUnitDto() return RaceUnits(race, infantry, tech, support) } private fun List.toUnitDto(): List = this.mapNotNull { val name = it.name ?: it.filename val icon = it.icon if (name == null || icon == null) null else UnitDto(name, icon, it.id!!, it.armorType?.name!!, (it.detectRadius ?: 0) > 0) } private fun getAllUnits(modId: Long, race: String? = null): List { val raceEntity = race?.let{ raceRepository.findById(race) ?: throw Exception("Race $race not found") } return filterCompanyUnits(unitRepository.findByModIdAndRace(modId, raceEntity)) } private fun filterCompanyUnits(units: List): List = units.filter { it.filename?.contains("_sp.") != true && it.filename?.contains("_sp_") != true && it.filename?.contains("sp_eldar_") != true && it.filename?.contains("_dxp3.") != true && it.filename?.contains("_dxp3_") != true && it.filename?.contains("_nis.") != true && it.filename?.contains("_exarch_council.") != true && it.filename?.contains("_dark_reapers_base.") != true && it.filename?.contains("tau_squad_slave_murdered") != true } }