"""Fixtures for P1 Monitor integration tests."""

import json
from unittest.mock import AsyncMock, MagicMock, patch

from p1monitor import Phases, Settings, SmartMeter, WaterMeter
import pytest

from homeassistant.components.p1_monitor.const import DOMAIN
from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant

from tests.common import MockConfigEntry, load_fixture


@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
    """Return the default mocked config entry."""
    return MockConfigEntry(
        title="monitor",
        domain=DOMAIN,
        data={CONF_HOST: "example", CONF_PORT: 80},
        unique_id="unique_thingy",
        version=2,
    )


@pytest.fixture
def mock_p1monitor():
    """Return a mocked P1 Monitor client."""
    with patch(
        "homeassistant.components.p1_monitor.coordinator.P1Monitor"
    ) as p1monitor_mock:
        client = p1monitor_mock.return_value
        client.smartmeter = AsyncMock(
            return_value=SmartMeter.from_dict(
                json.loads(load_fixture("p1_monitor/smartmeter.json"))
            )
        )
        client.phases = AsyncMock(
            return_value=Phases.from_dict(
                json.loads(load_fixture("p1_monitor/phases.json"))
            )
        )
        client.settings = AsyncMock(
            return_value=Settings.from_dict(
                json.loads(load_fixture("p1_monitor/settings.json"))
            )
        )
        client.watermeter = AsyncMock(
            return_value=WaterMeter.from_dict(
                json.loads(load_fixture("p1_monitor/watermeter.json"))
            )
        )
        yield client


@pytest.fixture
async def init_integration(
    hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_p1monitor: MagicMock
) -> MockConfigEntry:
    """Set up the P1 Monitor integration for testing."""
    mock_config_entry.add_to_hass(hass)

    await hass.config_entries.async_setup(mock_config_entry.entry_id)
    await hass.async_block_till_done()

    return mock_config_entry
