/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.launcher3.taskbar.rules

import com.android.quickstep.util.GroupTask
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement

class MockedRecentsModelTestRule(private val modelHelper: MockedRecentsModelHelper) : TestRule {
    private var recentTasks: List<GroupTask> = emptyList()

    override fun apply(base: Statement?, description: Description?): Statement {
        return object : Statement() {
            override fun evaluate() {
                base?.evaluate()
            }
        }
    }

    // NOTE: For the update to take effect, `resolvePendingTaskRequests()` needs to be called, so
    // calbacks to any pending `RecentsModel.getTasks()` get called with the updated task list.
    fun updateRecentTasks(tasks: List<GroupTask>) {
        ++modelHelper.taskListId
        recentTasks = tasks
        modelHelper.recentTasksChangedListener?.onRecentTasksChanged()
    }

    fun resolvePendingTaskRequests() {
        val requests = mutableListOf<(List<GroupTask>) -> Unit>()
        requests.addAll(modelHelper.taskRequests)
        modelHelper.taskRequests.clear()

        requests.forEach { it(recentTasks) }
    }
}
