"""Tests for Search integration."""

import pytest
from pytest_unordered import unordered

from homeassistant.components.search import ItemType, Searcher
from homeassistant.core import HomeAssistant
from homeassistant.helpers import (
    area_registry as ar,
    device_registry as dr,
    entity_registry as er,
    floor_registry as fr,
    label_registry as lr,
)
from homeassistant.helpers.entity import EntityInfo
from homeassistant.setup import async_setup_component

from tests.common import MockConfigEntry
from tests.typing import WebSocketGenerator


@pytest.fixture(autouse=True, name="stub_blueprint_populate")
def stub_blueprint_populate_autouse(stub_blueprint_populate: None) -> None:
    """Stub copying the blueprints to the config folder."""


async def test_search(
    hass: HomeAssistant,
    area_registry: ar.AreaRegistry,
    device_registry: dr.DeviceRegistry,
    entity_registry: er.EntityRegistry,
    floor_registry: fr.FloorRegistry,
    label_registry: lr.LabelRegistry,
    hass_ws_client: WebSocketGenerator,
) -> None:
    """Test search."""
    assert await async_setup_component(hass, "search", {})

    # Labels
    label_energy = label_registry.async_create("Energy")
    label_christmas = label_registry.async_create("Christmas")
    label_other = label_registry.async_create("Other")

    # Floors
    first_floor = floor_registry.async_create("First Floor")
    second_floor = floor_registry.async_create("Second Floor")

    # Areas
    bedroom_area = area_registry.async_create(
        "Bedroom", floor_id=second_floor.floor_id, labels={label_other.label_id}
    )
    kitchen_area = area_registry.async_create("Kitchen", floor_id=first_floor.floor_id)
    living_room_area = area_registry.async_create(
        "Living Room", floor_id=first_floor.floor_id
    )

    # Config entries
    hue_config_entry = MockConfigEntry(domain="hue")
    hue_config_entry.add_to_hass(hass)
    wled_config_entry = MockConfigEntry(domain="wled")
    wled_config_entry.add_to_hass(hass)

    # Devices
    hue_device = device_registry.async_get_or_create(
        config_entry_id=hue_config_entry.entry_id,
        name="Light Strip",
        identifiers={("hue", "hue-1")},
    )
    device_registry.async_update_device(hue_device.id, area_id=kitchen_area.id)

    wled_device = device_registry.async_get_or_create(
        config_entry_id=wled_config_entry.entry_id,
        name="Light Strip",
        identifiers=({"wled", "wled-1"}),
    )
    device_registry.async_update_device(
        wled_device.id, area_id=living_room_area.id, labels={label_christmas.label_id}
    )

    # Entities
    hue_segment_1_entity = entity_registry.async_get_or_create(
        "light",
        "hue",
        "hue-1-seg-1",
        suggested_object_id="hue segment 1",
        config_entry=hue_config_entry,
        device_id=hue_device.id,
    )
    entity_registry.async_update_entity(
        hue_segment_1_entity.entity_id, labels={label_energy.label_id}
    )
    hue_segment_2_entity = entity_registry.async_get_or_create(
        "light",
        "hue",
        "hue-1-seg-2",
        suggested_object_id="hue segment 2",
        config_entry=hue_config_entry,
        device_id=hue_device.id,
    )
    wled_segment_1_entity = entity_registry.async_get_or_create(
        "light",
        "wled",
        "wled-1-seg-1",
        suggested_object_id="wled segment 1",
        config_entry=wled_config_entry,
        device_id=wled_device.id,
    )
    wled_segment_2_entity = entity_registry.async_get_or_create(
        "light",
        "wled",
        "wled-1-seg-2",
        suggested_object_id="wled segment 2",
        config_entry=wled_config_entry,
        device_id=wled_device.id,
    )
    entity_registry.async_update_entity(
        wled_segment_2_entity.entity_id, area_id=bedroom_area.id
    )

    scene_wled_hue_entity = entity_registry.async_get_or_create(
        "scene",
        "homeassistant",
        "wled_hue",
        suggested_object_id="scene_wled_hue",
    )
    entity_registry.async_update_entity(
        scene_wled_hue_entity.entity_id,
        area_id=bedroom_area.id,
        labels={label_other.label_id},
    )

    # Persons can technically be assigned to areas
    person_paulus_entity = entity_registry.async_get_or_create(
        "person",
        "person",
        "abcd",
        suggested_object_id="paulus",
    )
    entity_registry.async_update_entity(
        person_paulus_entity.entity_id,
        area_id=bedroom_area.id,
        labels={label_other.label_id},
    )

    script_scene_entity = entity_registry.async_get_or_create(
        "script",
        "script",
        "scene",
        suggested_object_id="scene",
    )
    entity_registry.async_update_entity(
        script_scene_entity.entity_id,
        area_id=bedroom_area.id,
        labels={label_other.label_id},
    )

    # Entity sources
    entity_sources = {
        "light.wled_platform_config_source": EntityInfo(
            domain="wled",
        ),
        "light.wled_config_entry_source": EntityInfo(
            config_entry=wled_config_entry.entry_id,
            domain="wled",
        ),
    }

    # Groups
    await async_setup_component(
        hass,
        "group",
        {
            "group": {
                "wled": {
                    "name": "wled",
                    "entities": [
                        wled_segment_1_entity.entity_id,
                        wled_segment_2_entity.entity_id,
                    ],
                },
                "hue": {
                    "name": "hue",
                    "entities": [
                        hue_segment_1_entity.entity_id,
                        hue_segment_2_entity.entity_id,
                    ],
                },
                "wled_hue": {
                    "name": "wled and hue",
                    "entities": [
                        wled_segment_1_entity.entity_id,
                        wled_segment_2_entity.entity_id,
                        hue_segment_1_entity.entity_id,
                        hue_segment_2_entity.entity_id,
                    ],
                },
            }
        },
    )

    # Persons
    assert await async_setup_component(
        hass,
        "person",
        {
            "person": [
                {
                    "id": "abcd",
                    "name": "Paulus",
                    "device_trackers": ["device_tracker.paulus_iphone"],
                }
            ]
        },
    )

    # Scenes
    await async_setup_component(
        hass,
        "scene",
        {
            "scene": [
                {
                    "name": "scene_wled_seg_1",
                    "entities": {wled_segment_1_entity.entity_id: "on"},
                },
                {
                    "name": "scene_hue_seg_1",
                    "entities": {hue_segment_1_entity.entity_id: "on"},
                },
                {
                    "id": "wled_hue",
                    "name": "scene_wled_hue",
                    "entities": {
                        wled_segment_1_entity.entity_id: "on",
                        wled_segment_2_entity.entity_id: "on",
                        hue_segment_1_entity.entity_id: "on",
                        hue_segment_2_entity.entity_id: "on",
                    },
                },
            ]
        },
    )

    # Automations
    assert await async_setup_component(
        hass,
        "automation",
        {
            "automation": [
                {
                    "id": "unique_id",
                    "alias": "blueprint_automation_1",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "use_blueprint": {
                        "path": "test_event_service.yaml",
                        "input": {
                            "trigger_event": "blueprint_event_1",
                            "service_to_call": "test.automation_1",
                            "a_number": 5,
                        },
                    },
                },
                {
                    "alias": "blueprint_automation_2",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "use_blueprint": {
                        "path": "test_event_service.yaml",
                        "input": {
                            "trigger_event": "blueprint_event_2",
                            "service_to_call": "test.automation_2",
                            "a_number": 5,
                        },
                    },
                },
                {
                    "alias": "wled_entity",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "service": "test.script",
                            "data": {"entity_id": wled_segment_1_entity.entity_id},
                        },
                    ],
                },
                {
                    "alias": "wled_device",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "domain": "light",
                            "device_id": wled_device.id,
                            "entity_id": wled_segment_1_entity.entity_id,
                            "type": "turn_on",
                        },
                    ],
                },
                {
                    "alias": "floor",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "service": "test.script",
                            "target": {"floor_id": first_floor.floor_id},
                        },
                    ],
                },
                {
                    "alias": "area",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "service": "test.script",
                            "target": {"area_id": kitchen_area.id},
                        },
                    ],
                },
                {
                    "alias": "group",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "service": "homeassistant.turn_on",
                            "target": {"entity_id": "group.wled_hue"},
                        },
                    ],
                },
                {
                    "alias": "scene",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "scene": scene_wled_hue_entity.entity_id,
                        },
                    ],
                },
                {
                    "alias": "script",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "service": "script.turn_on",
                            "data": {"entity_id": script_scene_entity.entity_id},
                        },
                    ],
                },
                {
                    "alias": "label",
                    "trigger": {"platform": "template", "value_template": "true"},
                    "action": [
                        {
                            "service": "script.turn_on",
                            "target": {"label_id": label_christmas.label_id},
                        },
                    ],
                },
            ]
        },
    )

    # Scripts
    assert await async_setup_component(
        hass,
        "script",
        {
            "script": {
                "blueprint_script_1": {
                    "use_blueprint": {
                        "path": "test_service.yaml",
                        "input": {
                            "service_to_call": "test.automation",
                        },
                    }
                },
                "blueprint_script_2": {
                    "use_blueprint": {
                        "path": "test_service.yaml",
                        "input": {
                            "service_to_call": "test.automation",
                        },
                    }
                },
                "wled": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "data": {"entity_id": wled_segment_1_entity.entity_id},
                        },
                    ]
                },
                "hue": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "data": {"entity_id": hue_segment_1_entity.entity_id},
                        },
                    ]
                },
                "script_with_templated_services": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "target": "{{ {'entity_id':'test.test1'} }}",
                        },
                        {
                            "service": "test.script",
                            "data": "{{ {'entity_id':'test.test2'} }}",
                        },
                        {
                            "service": "test.script",
                            "data_template": "{{ {'entity_id':'test.test3'} }}",
                        },
                    ]
                },
                "device": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "target": {"device_id": hue_device.id},
                        },
                    ],
                },
                "floor": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "target": {"floor_id": first_floor.floor_id},
                        },
                    ],
                },
                "area": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "target": {"area_id": kitchen_area.id},
                        },
                    ],
                },
                "group": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "target": {"entity_id": "group.wled_hue"},
                        },
                    ],
                },
                "scene": {
                    "sequence": [
                        {
                            "scene": scene_wled_hue_entity.entity_id,
                        },
                    ],
                },
                "label": {
                    "sequence": [
                        {
                            "service": "test.script",
                            "target": {"label_id": label_other.label_id},
                        },
                    ],
                },
                "nested": {
                    "sequence": [
                        {
                            "service": "script.turn_on",
                            "data": {"entity_id": script_scene_entity.entity_id},
                        },
                    ],
                },
            }
        },
    )

    def search(item_type: ItemType, item_id: str) -> dict[str, set[str]]:
        """Search."""
        searcher = Searcher(hass, entity_sources)
        return searcher.async_search(item_type, item_id)

    #
    # Tests
    #
    assert not search(ItemType.AREA, "unknown")
    assert search(ItemType.AREA, bedroom_area.id) == {
        ItemType.AUTOMATION: {"automation.scene", "automation.script"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.ENTITY: {
            wled_segment_2_entity.entity_id,
            scene_wled_hue_entity.entity_id,
            script_scene_entity.entity_id,
            person_paulus_entity.entity_id,
        },
        ItemType.FLOOR: {second_floor.floor_id},
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.LABEL: {label_other.label_id},
        ItemType.PERSON: {person_paulus_entity.entity_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {script_scene_entity.entity_id, "script.nested"},
    }
    assert search(ItemType.AREA, living_room_area.id) == {
        ItemType.AUTOMATION: {"automation.wled_device", "automation.wled_entity"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.ENTITY: {wled_segment_1_entity.entity_id},
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.SCENE: {"scene.scene_wled_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.wled"},
    }
    assert search(ItemType.AREA, kitchen_area.id) == {
        ItemType.AUTOMATION: {"automation.area"},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.ENTITY: {
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.hue", "group.wled_hue"},
        ItemType.SCENE: {"scene.scene_hue_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.area", "script.device", "script.hue"},
    }

    assert not search(ItemType.AUTOMATION, "automation.unknown")
    assert search(ItemType.AUTOMATION, "automation.blueprint_automation_1") == {
        ItemType.AUTOMATION_BLUEPRINT: {"test_event_service.yaml"},
        ItemType.ENTITY: {"light.kitchen"},
    }
    assert search(ItemType.AUTOMATION, "automation.blueprint_automation_2") == {
        ItemType.AUTOMATION_BLUEPRINT: {"test_event_service.yaml"},
        ItemType.ENTITY: {"light.kitchen"},
    }
    assert search(ItemType.AUTOMATION, "automation.wled_entity") == {
        ItemType.AREA: {living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.ENTITY: {wled_segment_1_entity.entity_id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.AUTOMATION, "automation.wled_device") == {
        ItemType.AREA: {living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.AUTOMATION, "automation.floor") == {
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.AUTOMATION, "automation.area") == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.AUTOMATION, "automation.group") == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id, kitchen_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            "group.wled_hue",
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.GROUP: {"group.wled_hue"},
    }
    assert search(ItemType.AUTOMATION, "automation.scene") == {
        ItemType.AREA: {bedroom_area.id, kitchen_area.id, living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
            scene_wled_hue_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
    }
    assert search(ItemType.AUTOMATION, "automation.script") == {
        ItemType.AREA: {bedroom_area.id, kitchen_area.id, living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
            scene_wled_hue_entity.entity_id,
            script_scene_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {script_scene_entity.entity_id},
    }

    assert not search(ItemType.AUTOMATION_BLUEPRINT, "unknown.yaml")
    assert search(ItemType.AUTOMATION_BLUEPRINT, "test_event_service.yaml") == {
        ItemType.AUTOMATION: {
            "automation.blueprint_automation_1",
            "automation.blueprint_automation_2",
        }
    }

    assert not search(ItemType.CONFIG_ENTRY, "unknown")
    assert search(ItemType.CONFIG_ENTRY, hue_config_entry.entry_id) == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.ENTITY: {
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.hue", "group.wled_hue"},
        ItemType.SCENE: {"scene.scene_hue_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.device", "script.hue"},
    }
    assert search(ItemType.CONFIG_ENTRY, wled_config_entry.entry_id) == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id},
        ItemType.AUTOMATION: {"automation.wled_entity", "automation.wled_device"},
        ItemType.DEVICE: {wled_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.SCENE: {"scene.scene_wled_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.wled"},
    }

    assert not search(ItemType.DEVICE, "unknown")
    assert search(ItemType.DEVICE, wled_device.id) == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id},
        ItemType.AUTOMATION: {"automation.wled_entity", "automation.wled_device"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.LABEL: {label_christmas.label_id},
        ItemType.SCENE: {"scene.scene_wled_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.wled"},
    }
    assert search(ItemType.DEVICE, hue_device.id) == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.ENTITY: {
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.hue", "group.wled_hue"},
        ItemType.SCENE: {"scene.scene_hue_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.device", "script.hue"},
    }

    assert not search(ItemType.ENTITY, "sensor.unknown")
    assert search(ItemType.ENTITY, wled_segment_1_entity.entity_id) == {
        ItemType.AREA: {living_room_area.id},
        ItemType.AUTOMATION: {"automation.wled_entity"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.SCENE: {"scene.scene_wled_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.wled"},
    }
    assert search(ItemType.ENTITY, wled_segment_2_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.FLOOR: {second_floor.floor_id},
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
    }
    assert search(ItemType.ENTITY, hue_segment_1_entity.entity_id) == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.hue", "group.wled_hue"},
        ItemType.LABEL: {label_energy.label_id},
        ItemType.SCENE: {"scene.scene_hue_seg_1", scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.hue"},
    }
    assert search(ItemType.ENTITY, hue_segment_2_entity.entity_id) == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.FLOOR: {first_floor.floor_id},
        ItemType.GROUP: {"group.hue", "group.wled_hue"},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
    }
    assert not search(ItemType.ENTITY, "automation.wled")
    assert search(ItemType.ENTITY, script_scene_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.AUTOMATION: {"automation.script"},
        ItemType.FLOOR: {second_floor.floor_id},
        ItemType.LABEL: {label_other.label_id},
        ItemType.SCRIPT: {"script.nested"},
    }
    assert search(ItemType.ENTITY, "group.wled_hue") == {
        ItemType.AUTOMATION: {"automation.group"},
        ItemType.SCRIPT: {"script.group"},
    }
    assert search(ItemType.ENTITY, person_paulus_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.FLOOR: {second_floor.floor_id},
        ItemType.LABEL: {label_other.label_id},
    }
    assert search(ItemType.ENTITY, scene_wled_hue_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.AUTOMATION: {"automation.scene"},
        ItemType.FLOOR: {second_floor.floor_id},
        ItemType.LABEL: {label_other.label_id},
        ItemType.SCRIPT: {script_scene_entity.entity_id},
    }
    assert search(ItemType.ENTITY, "device_tracker.paulus_iphone") == {
        ItemType.PERSON: {person_paulus_entity.entity_id},
    }
    assert search(ItemType.ENTITY, "light.wled_config_entry_source") == {
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
    }

    assert not search(ItemType.FLOOR, "unknown")
    assert search(ItemType.FLOOR, first_floor.floor_id) == {
        ItemType.AREA: {kitchen_area.id, living_room_area.id},
        ItemType.AUTOMATION: {
            "automation.area",
            "automation.floor",
            "automation.wled_device",
            "automation.wled_entity",
        },
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id, wled_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id, wled_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.GROUP: {"group.hue", "group.wled", "group.wled_hue"},
        ItemType.SCENE: {
            "scene.scene_hue_seg_1",
            "scene.scene_wled_seg_1",
            scene_wled_hue_entity.entity_id,
        },
        ItemType.SCRIPT: {
            "script.device",
            "script.area",
            "script.floor",
            "script.hue",
            "script.wled",
        },
    }
    assert search(ItemType.FLOOR, second_floor.floor_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.AUTOMATION: {"automation.scene", "automation.script"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.ENTITY: {
            wled_segment_2_entity.entity_id,
            person_paulus_entity.entity_id,
            scene_wled_hue_entity.entity_id,
            script_scene_entity.entity_id,
        },
        ItemType.GROUP: {"group.wled", "group.wled_hue"},
        ItemType.PERSON: {person_paulus_entity.entity_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {script_scene_entity.entity_id, "script.nested"},
    }

    assert not search(ItemType.GROUP, "group.unknown")
    assert search(ItemType.GROUP, "group.wled") == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
    }
    assert search(ItemType.GROUP, "group.hue") == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.ENTITY: {
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.GROUP, "group.wled_hue") == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id, kitchen_area.id},
        ItemType.AUTOMATION: {"automation.group"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.SCRIPT: {"script.group"},
    }

    assert not search(ItemType.LABEL, "unknown")
    assert search(ItemType.LABEL, label_christmas.label_id) == {
        ItemType.AUTOMATION: {"automation.label"},
        ItemType.DEVICE: {wled_device.id},
    }
    assert search(ItemType.LABEL, label_energy.label_id) == {
        ItemType.ENTITY: {hue_segment_1_entity.entity_id},
    }
    assert search(ItemType.LABEL, label_other.label_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.ENTITY: {
            scene_wled_hue_entity.entity_id,
            person_paulus_entity.entity_id,
            script_scene_entity.entity_id,
        },
        ItemType.PERSON: {person_paulus_entity.entity_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {"script.label", script_scene_entity.entity_id},
    }

    assert not search(ItemType.PERSON, "person.unknown")
    assert search(ItemType.PERSON, person_paulus_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id},
        ItemType.ENTITY: {"device_tracker.paulus_iphone"},
        ItemType.FLOOR: {second_floor.floor_id},
        ItemType.LABEL: {label_other.label_id},
    }

    assert not search(ItemType.SCENE, "scene.unknown")
    assert search(ItemType.SCENE, "scene.scene_wled_seg_1") == {
        ItemType.AREA: {living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.ENTITY: {wled_segment_1_entity.entity_id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCENE, "scene.scene_hue_seg_1") == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.ENTITY: {hue_segment_1_entity.entity_id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCENE, scene_wled_hue_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id, kitchen_area.id},
        ItemType.AUTOMATION: {"automation.scene"},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.LABEL: {label_other.label_id},
        ItemType.SCRIPT: {script_scene_entity.entity_id},
    }

    assert not search(ItemType.SCRIPT, "script.unknown")
    assert search(ItemType.SCRIPT, "script.blueprint_script_1") == {
        ItemType.ENTITY: {"light.kitchen"},
        ItemType.SCRIPT_BLUEPRINT: {"test_service.yaml"},
    }
    assert search(ItemType.SCRIPT, "script.blueprint_script_2") == {
        ItemType.ENTITY: {"light.kitchen"},
        ItemType.SCRIPT_BLUEPRINT: {"test_service.yaml"},
    }
    assert search(ItemType.SCRIPT, "script.wled") == {
        ItemType.AREA: {living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id},
        ItemType.ENTITY: {wled_segment_1_entity.entity_id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCRIPT, "script.hue") == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.ENTITY: {hue_segment_1_entity.entity_id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCRIPT, "script.script_with_templated_services") == {}
    assert search(ItemType.SCRIPT, "script.device") == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.CONFIG_ENTRY: {hue_config_entry.entry_id},
        ItemType.DEVICE: {hue_device.id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCRIPT, "script.floor") == {
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCRIPT, "script.area") == {
        ItemType.AREA: {kitchen_area.id},
        ItemType.FLOOR: {first_floor.floor_id},
    }
    assert search(ItemType.SCRIPT, "script.group") == {
        ItemType.AREA: {bedroom_area.id, living_room_area.id, kitchen_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            "group.wled_hue",
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.GROUP: {"group.wled_hue"},
    }
    assert search(ItemType.SCRIPT, script_scene_entity.entity_id) == {
        ItemType.AREA: {bedroom_area.id, kitchen_area.id, living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
            scene_wled_hue_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.LABEL: {label_other.label_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
    }
    assert search(ItemType.SCRIPT, "script.nested") == {
        ItemType.AREA: {bedroom_area.id, kitchen_area.id, living_room_area.id},
        ItemType.CONFIG_ENTRY: {wled_config_entry.entry_id, hue_config_entry.entry_id},
        ItemType.DEVICE: {wled_device.id, hue_device.id},
        ItemType.ENTITY: {
            wled_segment_1_entity.entity_id,
            wled_segment_2_entity.entity_id,
            hue_segment_1_entity.entity_id,
            hue_segment_2_entity.entity_id,
            scene_wled_hue_entity.entity_id,
            script_scene_entity.entity_id,
        },
        ItemType.FLOOR: {first_floor.floor_id, second_floor.floor_id},
        ItemType.SCENE: {scene_wled_hue_entity.entity_id},
        ItemType.SCRIPT: {script_scene_entity.entity_id},
    }

    assert not search(ItemType.SCRIPT_BLUEPRINT, "unknown.yaml")
    assert search(ItemType.SCRIPT_BLUEPRINT, "test_service.yaml") == {
        ItemType.SCRIPT: {"script.blueprint_script_1", "script.blueprint_script_2"},
    }

    # WebSocket
    client = await hass_ws_client(hass)
    await client.send_json(
        {
            "id": 1,
            "type": "search/related",
            "item_type": "device",
            "item_id": hue_device.id,
        }
    )
    response = await client.receive_json()
    assert response["success"]
    assert response["result"] == {
        ItemType.AREA: [kitchen_area.id],
        ItemType.ENTITY: unordered(
            [
                hue_segment_1_entity.entity_id,
                hue_segment_2_entity.entity_id,
            ]
        ),
        ItemType.GROUP: unordered(
            [
                "group.hue",
                "group.wled_hue",
            ]
        ),
        ItemType.CONFIG_ENTRY: [hue_config_entry.entry_id],
        ItemType.FLOOR: [first_floor.floor_id],
        ItemType.SCENE: unordered(
            ["scene.scene_hue_seg_1", scene_wled_hue_entity.entity_id]
        ),
        ItemType.SCRIPT: unordered(["script.device", "script.hue"]),
    }