"""Tests for the MadVR sensor entities."""

from __future__ import annotations

from unittest.mock import AsyncMock, patch

import pytest
from syrupy import SnapshotAssertion

from homeassistant.components.madvr.sensor import get_temperature
from homeassistant.const import STATE_UNKNOWN, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er

from . import setup_integration
from .conftest import get_update_callback

from tests.common import MockConfigEntry, snapshot_platform


@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensor_setup_and_states(
    hass: HomeAssistant,
    snapshot: SnapshotAssertion,
    mock_config_entry: MockConfigEntry,
    entity_registry: er.EntityRegistry,
    mock_madvr_client: AsyncMock,
) -> None:
    """Test setup of the sensor entities and their states."""
    with patch("homeassistant.components.madvr.PLATFORMS", [Platform.SENSOR]):
        await setup_integration(hass, mock_config_entry)

    update_callback = get_update_callback(mock_madvr_client)

    # Create a big data update with all sensor values
    update_data = {
        "temp_gpu": 45.5,
        "temp_hdmi": 40.0,
        "temp_cpu": 50.2,
        "temp_mainboard": 35.8,
        "incoming_res": "3840x2160",
        "incoming_frame_rate": "60p",
        "outgoing_signal_type": "2D",
        "incoming_signal_type": "3D",
        "incoming_color_space": "RGB",
        "incoming_bit_depth": "10bit",
        "incoming_colorimetry": "2020",
        "incoming_black_levels": "PC",
        "incoming_aspect_ratio": "16:9",
        "outgoing_res": "3840x2160",
        "outgoing_frame_rate": "60p",
        "outgoing_color_space": "RGB",
        "outgoing_bit_depth": "10bit",
        "outgoing_colorimetry": "2020",
        "outgoing_black_levels": "PC",
        "aspect_res": "3840:2160",
        "aspect_dec": "1.78",
        "aspect_int": "178",
        "aspect_name": "Widescreen",
        "masking_res": "3840:2160",
        "masking_dec": "1.78",
        "masking_int": "178",
    }

    # Update all sensors at once
    update_callback(update_data)
    await hass.async_block_till_done()

    # Snapshot all entity states
    await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)

    # Test invalid temperature value
    update_callback({"temp_gpu": -1})
    await hass.async_block_till_done()
    assert hass.states.get("sensor.madvr_envy_gpu_temperature").state == STATE_UNKNOWN

    # Test sensor unknown
    update_callback({"incoming_res": None})
    await hass.async_block_till_done()
    assert (
        hass.states.get("sensor.madvr_envy_incoming_resolution").state == STATE_UNKNOWN
    )

    # Test sensor becomes known again
    update_callback({"incoming_res": "1920x1080"})
    await hass.async_block_till_done()
    assert hass.states.get("sensor.madvr_envy_incoming_resolution").state == "1920x1080"

    # Test temperature sensor
    update_callback({"temp_gpu": 41.2})
    await hass.async_block_till_done()
    assert hass.states.get("sensor.madvr_envy_gpu_temperature").state == "41.2"

    # test get_temperature ValueError
    assert get_temperature(None, "temp_key") is None

    # test startup placeholder values
    update_callback({"outgoing_bit_depth": "0bit"})
    await hass.async_block_till_done()
    assert (
        hass.states.get("sensor.madvr_envy_outgoing_bit_depth").state == STATE_UNKNOWN
    )

    update_callback({"outgoing_color_space": "?"})
    await hass.async_block_till_done()
    assert (
        hass.states.get("sensor.madvr_envy_outgoing_color_space").state == STATE_UNKNOWN
    )
