package com.yorvana.testsupport

import android.net.Uri
import com.yorvana.R
import com.yorvana.YorvanaApplication
import com.yorvana.data.preferences.CURRENT_CONSENT_VERSION
import com.yorvana.data.preferences.DebugBillingOverrideMode
import com.yorvana.util.CrashReporter
import kotlinx.coroutines.runBlocking
import java.io.File

fun MainActivityComposeRule.resetYorvanaState() {
    val app = activity.application as YorvanaApplication
    activity
        .getSharedPreferences(com.yorvana.ui.navigation.NAV_PREFS, android.content.Context.MODE_PRIVATE)
        .edit()
        .clear()
        .apply()
    runBlocking {
        app.vaultStorage.clearVault()
        app.preferences.setVaultUri(null)
        app.preferences.setCrashReportingConsentPromptShownVersion(0)
        app.preferences.setCrashReportingEnabled(false)
        CrashReporter.clear(app)
        app.debugBillingOverride?.setMode(DebugBillingOverrideMode.NONE)
    }
}

fun MainActivityComposeRule.installFreshVault(
    vaultName: String = "test_vault",
    seed: ((File) -> Unit)? = null,
) {
    val app = activity.application as YorvanaApplication
    val vaultFile = File(activity.filesDir, vaultName)
    vaultFile.deleteRecursively()
    vaultFile.mkdirs()
    seed?.invoke(vaultFile)

    val uri = Uri.fromFile(vaultFile)
    runBlocking {
        app.preferences.setCrashReportingConsentPromptShownVersion(CURRENT_CONSENT_VERSION)
        app.preferences.setVaultUri(uri.toString())
        app.applyVaultUri(uri.toString())
    }
    waitForIdle()
    awaitText(activity.getString(R.string.my_garage), timeoutMillis = 30_000)
}

fun MainActivityComposeRule.installVaultFixture(vault: VaultFixture) {
    val app = activity.application as YorvanaApplication
    runBlocking {
        app.preferences.setCrashReportingConsentPromptShownVersion(CURRENT_CONSENT_VERSION)
        app.preferences.setVaultUri(vault.uri.toString())
        app.applyVaultUri(vault.uri.toString())
    }
    waitForIdle()
    awaitText(activity.getString(R.string.my_garage), timeoutMillis = 30_000)
}
