package com.yorvana.ui.settings

import android.content.Context
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import androidx.test.core.app.ApplicationProvider
import com.yorvana.R
import com.yorvana.data.model.OdometerUnit
import com.yorvana.ui.TestTags
import com.yorvana.ui.theme.YorvanaTheme
import com.yorvana.ui.util.BaseScreenshotTest
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Rule
import org.junit.Test

class SettingsScreenshotTest : BaseScreenshotTest() {
    @get:Rule
    val composeTestRule = createComposeRule()

    @Suppress("LongParameterList")
    private fun setupScreen(
        showConflict: Boolean = false,
        isValidating: Boolean = false,
        showExistingVault: Boolean = false,
        isDark: Boolean = false,
        crashReportingEnabled: Boolean = false,
        isPremium: Boolean = false,
    ) {
        val mockViewModel = mockk<SettingsViewModel>(relaxed = true)
        val stateFlow =
            MutableStateFlow(
                SettingsState(
                    vaultUriString = "content://com.android.externalstorage.documents/tree/primary%3AYorvana",
                    defaultOdometerUnit = OdometerUnit.KM,
                    defaultCurrency = "USD",
                    appVersion = "1.0.0",
                    showConflictDialog = showConflict,
                    isValidating = isValidating,
                    showUseExistingVaultDialog = showExistingVault,
                    crashReportingEnabled = crashReportingEnabled,
                    isPremium = isPremium,
                ),
            )
        every { mockViewModel.state } returns stateFlow

        composeTestRule.setContent {
            YorvanaTheme(dynamicColor = false, darkTheme = isDark) {
                SettingsScreen(
                    backStack = mockk(relaxed = true),
                    viewModel = mockViewModel,
                )
            }
        }
    }

    @Test
    fun settings_light() {
        setupScreen(isDark = false)
        composeTestRule.onRoot().captureScreen("SettingsScreen_light")
    }

    @Test
    fun settings_dark() {
        setupScreen(isDark = true)
        composeTestRule.onRoot().captureScreen("SettingsScreen_dark")
    }

    @Test
    fun settings_premium_light() {
        setupScreen(isDark = false, isPremium = true)
        composeTestRule.onRoot().captureScreen("SettingsScreen_premium_light")
    }

    @Test
    fun settings_premium_dark() {
        setupScreen(isDark = true, isPremium = true)
        composeTestRule.onRoot().captureScreen("SettingsScreen_premium_dark")
    }

    @Test
    fun settings_conflict_light() {
        setupScreen(showConflict = true, isDark = false)
        captureFull("SettingsScreen_conflict_light")
    }

    @Test
    fun settings_validating_light() {
        setupScreen(isValidating = true, isDark = false)
        captureFull("SettingsScreen_validating_light")
    }

    @Test
    fun settings_existing_vault_light() {
        setupScreen(showExistingVault = true, isDark = false)
        captureFull("SettingsScreen_existing_vault_light")
    }

    @Test
    fun settings_crash_reporting_on_light() {
        setupScreen(crashReportingEnabled = true)
        composeTestRule.onRoot().captureScreen("SettingsScreen_crash_reporting_on_light")
    }

    @Test
    fun settings_privacy_dialog() {
        setupScreen(isDark = false)
        composeTestRule.onNodeWithTag(TestTags.PRIVACY_LEARN_MORE).performClick()
        composeTestRule.waitForIdle()
        captureFull("SettingsScreen_privacy_dialog")
    }

    @Test
    fun settings_privacy_section_light() {
        setupScreen(isDark = false)
        val context = ApplicationProvider.getApplicationContext<Context>()
        composeTestRule
            .onNodeWithText(context.getString(R.string.settings_report_bug))
            .performScrollTo()
        captureFull("SettingsScreen_privacy_section_light")
    }

    @Test
    fun settingsScreen_debug_crash_section_light() {
        setupScreen(isDark = false)
        // Scroll to the bottom to see the debug section
        val context = ApplicationProvider.getApplicationContext<Context>()
        composeTestRule
            .onNodeWithText(context.getString(R.string.settings_force_test_crash))
            .performScrollTo()
        captureFull("SettingsScreen_debug_crash_section_light")
    }

    @Test
    fun settingsScreen_debug_crash_section_dark() {
        setupScreen(isDark = true)
        // Scroll to the bottom to see the debug section
        val context = ApplicationProvider.getApplicationContext<Context>()
        composeTestRule
            .onNodeWithText(context.getString(R.string.settings_force_test_crash))
            .performScrollTo()
        captureFull("SettingsScreen_debug_crash_section_dark")
    }
}
