package com.yorvana.ui.vehicles

import androidx.activity.ComponentActivity
import androidx.compose.ui.test.assertContentDescriptionEquals
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.yorvana.TestYorvanaApplication
import com.yorvana.ui.TestTags
import com.yorvana.ui.theme.YorvanaTheme
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

@RunWith(RobolectricTestRunner::class)
@Config(application = TestYorvanaApplication::class, sdk = [34])
class AddEditVehicleScreenTest {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    @Test
    fun `clicking disabled save button in read-only mode triggers BlockedWriteAttempted`() {
        val mockViewModel = mockk<AddEditVehicleViewModel>(relaxed = true)
        val stateFlow = MutableStateFlow(AddEditVehicleState(isReadOnly = true))
        every { mockViewModel.state } returns stateFlow

        composeTestRule.setContent {
            YorvanaTheme {
                AddEditVehicleScreen(
                    vehicleId = null,
                    backStack = mockk(relaxed = true),
                    viewModel = mockViewModel,
                )
            }
        }

        composeTestRule.onNodeWithTag(TestTags.SAVE_BUTTON).performClick()

        verify { mockViewModel.onEvent(AddEditVehicleEvent.BlockedWriteAttempted) }
    }

    @Test
    fun `nickname field has required label semantics and handles recomposition`() {
        val mockViewModel = mockk<AddEditVehicleViewModel>(relaxed = true)
        val stateFlow = MutableStateFlow(AddEditVehicleState())
        every { mockViewModel.state } returns stateFlow

        composeTestRule.setContent {
            YorvanaTheme {
                AddEditVehicleScreen(
                    vehicleId = null,
                    backStack = mockk(relaxed = true),
                    viewModel = mockViewModel,
                )
            }
        }

        // The label "Nickname" should be rendered using RequiredLabel
        val nicknameLabel = composeTestRule.activity.getString(com.yorvana.R.string.vehicle_nickname)
        val expectedAnnouncement = composeTestRule.activity.getString(com.yorvana.R.string.common_required_suffix, nicknameLabel)

        composeTestRule
            .onNodeWithText(nicknameLabel, substring = true)
            .assertContentDescriptionEquals(expectedAnnouncement)

        // Trigger recomposition to cover compiler-generated branches in the label lambda
        stateFlow.value = stateFlow.value.copy(nickname = "New Nickname", nicknameError = "Error")
        composeTestRule.waitForIdle()

        composeTestRule.onNodeWithText(nicknameLabel, substring = true).assertExists()
    }
}
