package com.yorvana.ui.vehicles

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onRoot
import com.yorvana.data.model.OdometerUnit
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 AddEditVehicleScreenshotTest : BaseScreenshotTest() {
    @get:Rule
    val composeTestRule = createComposeRule()

    private fun setupScreen(
        isEditMode: Boolean,
        isDark: Boolean = false,
    ) {
        val mockViewModel = mockk<AddEditVehicleViewModel>(relaxed = true)
        val stateFlow =
            MutableStateFlow(
                AddEditVehicleState(
                    nickname = if (isEditMode) "Project 86" else "",
                    make = if (isEditMode) "Toyota" else "",
                    model = if (isEditMode) "86" else "",
                    year = if (isEditMode) "2017" else "",
                    vin = if (isEditMode) "1234567890ABCDEFG" else "",
                    licensePlate = if (isEditMode) "XYZ-1234" else "",
                    odometerUnit = OdometerUnit.KM,
                    isEditMode = isEditMode,
                ),
            )
        every { mockViewModel.state } returns stateFlow

        composeTestRule.setContent {
            YorvanaTheme(dynamicColor = false, darkTheme = isDark) {
                AddEditVehicleScreen(
                    vehicleId = if (isEditMode) "1" else null,
                    backStack = mockk(relaxed = true),
                    viewModel = mockViewModel,
                )
            }
        }
    }

    @Test
    fun addMode_light() {
        setupScreen(isEditMode = false, isDark = false)
        composeTestRule.onRoot().captureScreen("AddEditVehicleScreen_add_light")
    }

    @Test
    fun addMode_dark() {
        setupScreen(isEditMode = false, isDark = true)
        composeTestRule.onRoot().captureScreen("AddEditVehicleScreen_add_dark")
    }

    @Test
    fun editMode_light() {
        setupScreen(isEditMode = true, isDark = false)
        composeTestRule.onRoot().captureScreen("AddEditVehicleScreen_edit_light")
    }

    @Test
    fun editMode_dark() {
        setupScreen(isEditMode = true, isDark = true)
        composeTestRule.onRoot().captureScreen("AddEditVehicleScreen_edit_dark")
    }
}
