package solutions.tretter.githugandroid import androidx.compose.runtime.saveable.listSaver val RepoStateSaver = listSaver( save = { state -> listOf( state.initialized, state.headBranch, state.files.flatMap { listOf(it.name, it.content, it.staged.toString(), it.tracked.toString(), it.deleted.toString()) }, state.commits.flatMap { listOf(it.id, it.message) }, state.branches.flatMap { listOf(it.key, it.value.toString()) }, state.currentDir, state.tags, state.remotes.flatMap { listOf(it.key, it.value) }, state.config.flatMap { listOf(it.key, it.value) }, state.stashes, state.fetchedBranches.toList(), state.pushedBranches.toList(), state.pushedTags.toList(), state.submodules.flatMap { listOf(it.key, it.value) }, state.maintenanceActions.toList(), ) }, restore = { saved -> val initialized = saved[0] as Boolean val headBranch = saved[1] as String val fileParts = saved[2] as List<*> val commitParts = saved[3] as List<*> val branchParts = saved[4] as List<*> val tags = saved[6] as List<*> val remoteParts = saved[7] as List<*> val configParts = saved.getOrNull(8) as? List<*> ?: emptyList() val stashes = saved.getOrNull(9) as? List<*> ?: emptyList() val fetchedBranches = saved.getOrNull(10) as? List<*> ?: emptyList() val pushedBranches = saved.getOrNull(11) as? List<*> ?: emptyList() val pushedTags = saved.getOrNull(12) as? List<*> ?: emptyList() val submoduleParts = saved.getOrNull(13) as? List<*> ?: emptyList() val maintenanceActions = saved.getOrNull(14) as? List<*> ?: emptyList() RepoState( initialized = initialized, headBranch = headBranch, files = fileParts.chunked(if (fileParts.size % 5 == 0) 5 else 4).map { GitFile( name = it[0] as String, content = it[1] as String, staged = (it[2] as String).toBoolean(), tracked = (it[3] as String).toBoolean(), deleted = (it.getOrNull(4) as? String)?.toBoolean() ?: false, ) }, commits = commitParts.chunked(2).map { CommitNode(it[0] as String, it[1] as String) }, branches = branchParts.chunked(2).associate { (it[0] as String) to (it[1] as String).toInt() }, currentDir = saved[5] as String, tags = tags.filterIsInstance(), remotes = remoteParts.chunked(2).associate { (it[0] as String) to (it[1] as String) }, config = configParts.chunked(2).associate { (it[0] as String) to (it[1] as String) }, stashes = stashes.filterIsInstance(), fetchedBranches = fetchedBranches.filterIsInstance().toSet(), pushedBranches = pushedBranches.filterIsInstance().toSet(), pushedTags = pushedTags.filterIsInstance().toSet(), submodules = submoduleParts.chunked(2).associate { (it[0] as String) to (it[1] as String) }, maintenanceActions = maintenanceActions.filterIsInstance().toSet(), ) } )