/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.focus.engine

import mozilla.components.browser.state.action.BrowserAction
import mozilla.components.browser.state.action.InitAction
import mozilla.components.browser.state.action.TabListAction
import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.lib.state.Middleware
import mozilla.components.lib.state.Store

/**
 * Middleware preventing creating non-private tabs.
 */
class SanityCheckMiddleware : Middleware<BrowserState, BrowserAction> {
    override fun invoke(
        store: Store<BrowserState, BrowserAction>,
        next: (BrowserAction) -> Unit,
        action: BrowserAction,
    ) {
        next(action)

        if (action is TabListAction || action is InitAction) {
            verifyNoNonPrivateTabs(store.state)
        }
    }

    private fun verifyNoNonPrivateTabs(state: BrowserState) {
        if (state.normalTabs.isNotEmpty()) {
            throw IllegalStateException("State contains non-private tabs")
        }
    }
}
