"""The test for the moon sensor platform."""
from __future__ import annotations

from unittest.mock import patch

import pytest

from homeassistant.components.moon.sensor import (
    MOON_ICONS,
    STATE_FIRST_QUARTER,
    STATE_FULL_MOON,
    STATE_LAST_QUARTER,
    STATE_NEW_MOON,
    STATE_WANING_CRESCENT,
    STATE_WANING_GIBBOUS,
    STATE_WAXING_CRESCENT,
    STATE_WAXING_GIBBOUS,
)
from homeassistant.components.sensor import ATTR_OPTIONS, SensorDeviceClass
from homeassistant.const import ATTR_DEVICE_CLASS, ATTR_FRIENDLY_NAME, ATTR_ICON
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er

from tests.common import MockConfigEntry


@pytest.mark.parametrize(
    ("moon_value", "native_value", "icon"),
    [
        (0, STATE_NEW_MOON, MOON_ICONS[STATE_NEW_MOON]),
        (5, STATE_WAXING_CRESCENT, MOON_ICONS[STATE_WAXING_CRESCENT]),
        (7, STATE_FIRST_QUARTER, MOON_ICONS[STATE_FIRST_QUARTER]),
        (12, STATE_WAXING_GIBBOUS, MOON_ICONS[STATE_WAXING_GIBBOUS]),
        (14.3, STATE_FULL_MOON, MOON_ICONS[STATE_FULL_MOON]),
        (20.1, STATE_WANING_GIBBOUS, MOON_ICONS[STATE_WANING_GIBBOUS]),
        (20.8, STATE_LAST_QUARTER, MOON_ICONS[STATE_LAST_QUARTER]),
        (23, STATE_WANING_CRESCENT, MOON_ICONS[STATE_WANING_CRESCENT]),
    ],
)
async def test_moon_day(
    hass: HomeAssistant,
    mock_config_entry: MockConfigEntry,
    moon_value: float,
    native_value: str,
    icon: str,
) -> None:
    """Test the Moon sensor."""
    mock_config_entry.add_to_hass(hass)

    with patch(
        "homeassistant.components.moon.sensor.moon.phase", return_value=moon_value
    ):
        await hass.config_entries.async_setup(mock_config_entry.entry_id)
        await hass.async_block_till_done()

    state = hass.states.get("sensor.moon_phase")
    assert state
    assert state.state == native_value
    assert state.attributes[ATTR_ICON] == icon
    assert state.attributes[ATTR_FRIENDLY_NAME] == "Moon Phase"
    assert state.attributes[ATTR_DEVICE_CLASS] == SensorDeviceClass.ENUM
    assert state.attributes[ATTR_OPTIONS] == [
        STATE_FIRST_QUARTER,
        STATE_FULL_MOON,
        STATE_LAST_QUARTER,
        STATE_NEW_MOON,
        STATE_WANING_CRESCENT,
        STATE_WANING_GIBBOUS,
        STATE_WAXING_CRESCENT,
        STATE_WAXING_GIBBOUS,
    ]

    entity_registry = er.async_get(hass)
    entry = entity_registry.async_get("sensor.moon_phase")
    assert entry
    assert entry.unique_id == mock_config_entry.entry_id
    assert entry.translation_key == "phase"

    device_registry = dr.async_get(hass)
    assert entry.device_id
    device_entry = device_registry.async_get(entry.device_id)
    assert device_entry
    assert device_entry.name == "Moon"
    assert device_entry.entry_type is dr.DeviceEntryType.SERVICE