"""Test the Fully Kiosk Browser camera platform."""

from unittest.mock import MagicMock

from fullykiosk import FullyKioskError
import pytest

from homeassistant.components.camera import async_get_image
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_registry as er

from tests.common import MockConfigEntry


async def test_camera(
    hass: HomeAssistant,
    entity_registry: er.EntityRegistry,
    mock_fully_kiosk: MagicMock,
    init_integration: MockConfigEntry,
) -> None:
    """Test the camera entity."""
    entity_camera = "camera.amazon_fire"
    entity = hass.states.get(entity_camera)
    assert entity
    assert entity.state == "idle"
    entry = entity_registry.async_get(entity_camera)
    assert entry
    assert entry.unique_id == "abcdef-123456-camera"

    mock_fully_kiosk.getSettings.return_value = {"motionDetection": True}
    await hass.services.async_call(
        "camera",
        "turn_on",
        {"entity_id": entity_camera},
        blocking=True,
    )
    assert len(mock_fully_kiosk.enableMotionDetection.mock_calls) == 1

    mock_fully_kiosk.getCamshot.return_value = b"image_bytes"
    image = await async_get_image(hass, entity_camera)
    assert mock_fully_kiosk.getCamshot.call_count == 1
    assert image.content == b"image_bytes"

    fully_kiosk_error = FullyKioskError("error", "status")
    mock_fully_kiosk.getCamshot.side_effect = fully_kiosk_error
    with pytest.raises(HomeAssistantError) as error:
        await async_get_image(hass, entity_camera)
    assert error.value.args[0] == fully_kiosk_error

    mock_fully_kiosk.getSettings.return_value = {"motionDetection": False}
    await hass.services.async_call(
        "camera",
        "turn_off",
        {"entity_id": entity_camera},
        blocking=True,
    )
    assert len(mock_fully_kiosk.disableMotionDetection.mock_calls) == 1

    with pytest.raises(HomeAssistantError) as error:
        await async_get_image(hass, entity_camera)
    assert error.value.args[0] == "Camera is off"