DEADSOFTWARE

81b8a98c0fdd6b9a21719db1758cfd1f7bc199d2
[cavedroid.git] /
1 package ru.fredboy.cavedroid.data.menu.repository
2
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
11
12 @MenuScope
13 class MenuButtonRepositoryImpl @Inject constructor(
14 private val menuButtonMapper: MenuButtonMapper,
15 ) : MenuButtonRepository {
16
17 private var _initialized = false
18
19 private val menuMap = LinkedHashMap<String, MutableMap<String, MenuButton>>()
20
21 private var currentMenu = "main"
22
23 init {
24 initialize()
25 }
26
27 override fun initialize() {
28 if (_initialized) {
29 Gdx.app.debug(TAG, "Attempted to init when already initialized")
30 return
31 }
32
33 val jsonString = Gdx.files.internal("json/menu.json").readString()
34
35 JsonFormat.decodeFromString<Map<String, Map<String, MenuButtonDto>>>(jsonString)
36 .forEach { (key, value) ->
37 menuMap[key] = value.mapValues { (_, dto) -> menuButtonMapper.map(dto) }.toMutableMap()
38 }
39
40 _initialized = true
41 }
42
43 override fun getButtonsForMenu(menuKey: String): Map<String, MenuButton>? {
44 require(_initialized) { "$TAG was not initialized before access!" }
45
46 return menuMap[menuKey].also {
47 if (it == null) {
48 Gdx.app.debug(TAG, "No buttons for $menuKey menu found")
49 }
50 }
51 }
52
53 override fun setCurrentMenu(menuKey: String) {
54 currentMenu = menuKey
55 }
56
57 override fun getCurrentMenuButtons(): Map<String, MenuButton>? {
58 require(_initialized) { "$TAG was not initialized before access!" }
59
60 return menuMap[currentMenu]?.filterValues { button -> button.isVisible }
61 }
62
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")
66 return
67 }
68
69 val button = menu[buttonKey] ?: run {
70 Gdx.app.error(TAG, "setButtonEnabled: button with key '$buttonKey' not found")
71 return
72 }
73
74 menu[buttonKey] = menuButtonMapper.setButtonEnabled(button, enabled)
75 }
76
77 override fun dispose() {
78 menuMap.clear()
79 _initialized = false
80 }
81
82 companion object {
83 private const val TAG = "MenuButtonsRepositoryImpl"
84
85 private val JsonFormat = Json { ignoreUnknownKeys = true }
86 }
87
88 }