package com.yorvana.ui.vehicles

import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import com.yorvana.TestYorvanaApplication
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config

@Config(application = TestYorvanaApplication::class, sdk = [34])
@RunWith(RobolectricTestRunner::class)
class AddEditVehicleScreenIT {
    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun addEditVehicleScreen_displaysCorrectTitle_inAddMode() {
        val mockViewModel = mockk<AddEditVehicleViewModel>(relaxed = true)
        val stateFlow = MutableStateFlow(AddEditVehicleState(isEditMode = false))
        every { mockViewModel.state } returns stateFlow

        val mockBackStack = mockk<NavBackStack<NavKey>>(relaxed = true)

        composeTestRule.setContent {
            AddEditVehicleScreen(
                vehicleId = null,
                backStack = mockBackStack,
                viewModel = mockViewModel,
            )
        }

        // Verify Title for Add mode using testTag
        composeTestRule.onNodeWithTag("ScreenTitle").assertIsDisplayed()
    }

    @Test
    fun addEditVehicleScreen_displaysCorrectTitle_inEditMode() {
        val mockViewModel = mockk<AddEditVehicleViewModel>(relaxed = true)
        val stateFlow =
            MutableStateFlow(
                AddEditVehicleState(
                    isEditMode = true,
                    nickname = "Old Name",
                ),
            )
        every { mockViewModel.state } returns stateFlow

        val mockBackStack = mockk<NavBackStack<NavKey>>(relaxed = true)

        composeTestRule.setContent {
            AddEditVehicleScreen(
                vehicleId = "v1",
                backStack = mockBackStack,
                viewModel = mockViewModel,
            )
        }

        // Verify Title for Edit mode using testTag
        composeTestRule.onNodeWithTag("ScreenTitle").assertIsDisplayed()
    }

    @Test
    fun inputFields_triggerEvents() {
        val mockViewModel = mockk<AddEditVehicleViewModel>(relaxed = true)
        val stateFlow = MutableStateFlow(AddEditVehicleState())
        every { mockViewModel.state } returns stateFlow

        val mockBackStack = mockk<NavBackStack<NavKey>>(relaxed = true)

        composeTestRule.setContent {
            AddEditVehicleScreen(
                vehicleId = null,
                backStack = mockBackStack,
                viewModel = mockViewModel,
            )
        }

        // Enter Nickname
        composeTestRule.onNodeWithText("Nickname", substring = true, ignoreCase = true).performTextInput("My Car")
        verify { mockViewModel.onEvent(AddEditVehicleEvent.NicknameChanged("My Car")) }

        // Enter Make via Dialog
        composeTestRule.onNodeWithTag("MakeField").performClick()
        composeTestRule.onNodeWithText("Acura").performClick()
        verify { mockViewModel.onEvent(AddEditVehicleEvent.MakeChanged("Acura")) }

        // Enter Model
        composeTestRule.onNodeWithText("Model", substring = true, ignoreCase = true).performTextInput("Corolla")
        verify { mockViewModel.onEvent(AddEditVehicleEvent.ModelChanged("Corolla")) }

        // Click Save
        composeTestRule.onNodeWithTag("SaveButton").performClick()
        verify { mockViewModel.onEvent(AddEditVehicleEvent.Save) }
    }
}
