1 package ru.fredboy.cavedroid.data.menu.repository
3 import com.badlogic.gdx.Gdx
4 import kotlinx.serialization.json.Json
5 import ru.fredboy.cavedroid.common.di.MenuScope
6 import ru.fredboy.cavedroid.data.menu.mapper.MenuButtonMapper
7 import ru.fredboy.cavedroid.data.menu.model.MenuButtonDto
8 import ru.fredboy.cavedroid.domain.menu.model.MenuButton
9 import ru.fredboy.cavedroid.domain.menu.repository.MenuButtonRepository
10 import javax.inject.Inject
13 class MenuButtonRepositoryImpl @Inject constructor(
14 private val menuButtonMapper: MenuButtonMapper,
15 ) : MenuButtonRepository {
17 private var _initialized = false
19 private val menuMap = LinkedHashMap<String, MutableMap<String, MenuButton>>()
21 private var currentMenu = "main"
27 override fun initialize() {
29 Gdx.app.debug(TAG, "Attempted to init when already initialized")
33 val jsonString = Gdx.files.internal("json/menu.json").readString()
35 JsonFormat.decodeFromString<Map<String, Map<String, MenuButtonDto>>>(jsonString)
36 .forEach { (key, value) ->
37 menuMap[key] = value.mapValues { (_, dto) -> menuButtonMapper.map(dto) }.toMutableMap()
43 override fun getButtonsForMenu(menuKey: String): Map<String, MenuButton>? {
44 require(_initialized) { "$TAG was not initialized before access!" }
46 return menuMap[menuKey].also {
48 Gdx.app.debug(TAG, "No buttons for $menuKey menu found")
53 override fun setCurrentMenu(menuKey: String) {
57 override fun getCurrentMenuButtons(): Map<String, MenuButton>? {
58 require(_initialized) { "$TAG was not initialized before access!" }
60 return menuMap[currentMenu]?.filterValues { button -> button.isVisible }
63 override fun setButtonEnabled(menuKey: String, buttonKey: String, enabled: Boolean) {
64 val menu = menuMap[menuKey] ?: run {
65 Gdx.app.error(TAG, "setButtonEnabled: menu with key '$menuKey' not found")
69 val button = menu[buttonKey] ?: run {
70 Gdx.app.error(TAG, "setButtonEnabled: button with key '$buttonKey' not found")
74 menu[buttonKey] = menuButtonMapper.setButtonEnabled(button, enabled)
77 override fun dispose() {
83 private const val TAG = "MenuButtonsRepositoryImpl"
85 private val JsonFormat = Json { ignoreUnknownKeys = true }