"""Test nest diagnostics."""

from unittest.mock import patch

from google_nest_sdm.exceptions import SubscriberException
import pytest

from homeassistant.config_entries import ConfigEntryState

from .common import TEST_CONFIG_LEGACY

from tests.components.diagnostics import get_diagnostics_for_config_entry


async def test_entry_diagnostics(
    hass, hass_client, create_device, setup_platform, config_entry
):
    """Test config entry diagnostics."""
    create_device.create(
        raw_data={
            "name": "enterprises/project-id/devices/device-id",
            "type": "sdm.devices.types.THERMOSTAT",
            "assignee": "enterprises/project-id/structures/structure-id/rooms/room-id",
            "traits": {
                "sdm.devices.traits.Info": {
                    "customName": "My Sensor",
                },
                "sdm.devices.traits.Temperature": {
                    "ambientTemperatureCelsius": 25.1,
                },
                "sdm.devices.traits.Humidity": {
                    "ambientHumidityPercent": 35.0,
                },
            },
            "parentRelations": [
                {
                    "parent": "enterprises/project-id/structures/structure-id/rooms/room-id",
                    "displayName": "Lobby",
                }
            ],
        }
    )
    await setup_platform()
    assert config_entry.state is ConfigEntryState.LOADED

    # Test that only non identifiable device information is returned
    assert await get_diagnostics_for_config_entry(hass, hass_client, config_entry) == {
        "devices": [
            {
                "data": {
                    "assignee": "**REDACTED**",
                    "name": "**REDACTED**",
                    "parentRelations": [
                        {"displayName": "**REDACTED**", "parent": "**REDACTED**"}
                    ],
                    "traits": {
                        "sdm.devices.traits.Info": {"customName": "**REDACTED**"},
                        "sdm.devices.traits.Humidity": {"ambientHumidityPercent": 35.0},
                        "sdm.devices.traits.Temperature": {
                            "ambientTemperatureCelsius": 25.1
                        },
                    },
                    "type": "sdm.devices.types.THERMOSTAT",
                }
            }
        ],
    }


async def test_setup_susbcriber_failure(
    hass, hass_client, config_entry, setup_base_platform
):
    """Test configuration error."""
    with patch(
        "homeassistant.helpers.config_entry_oauth2_flow.async_get_config_entry_implementation"
    ), patch(
        "homeassistant.components.nest.api.GoogleNestSubscriber.start_async",
        side_effect=SubscriberException(),
    ):
        await setup_base_platform()

    assert config_entry.state is ConfigEntryState.SETUP_RETRY

    assert await get_diagnostics_for_config_entry(hass, hass_client, config_entry) == {
        "error": "No subscriber configured"
    }


@pytest.mark.parametrize("nest_test_config", [TEST_CONFIG_LEGACY])
async def test_legacy_config_entry_diagnostics(
    hass, hass_client, config_entry, setup_base_platform
):
    """Test config entry diagnostics for legacy integration doesn't fail."""

    with patch("homeassistant.components.nest.legacy.Nest"):
        await setup_base_platform()

    assert await get_diagnostics_for_config_entry(hass, hass_client, config_entry) == {}