"""Tests for the OctoPrint integration."""
from __future__ import annotations

from typing import Any
from unittest.mock import patch

from pyoctoprintapi import (
    DiscoverySettings,
    OctoprintJobInfo,
    OctoprintPrinterInfo,
    TrackingSetting,
)

from homeassistant.components.octoprint import DOMAIN
from homeassistant.config_entries import ConfigEntryState
from homeassistant.helpers.typing import UNDEFINED, UndefinedType

from tests.common import MockConfigEntry

DEFAULT_JOB = {
    "job": {},
    "progress": {"completion": 50},
}

DEFAULT_PRINTER = {
    "state": {
        "flags": {"printing": True, "error": False},
        "text": "Operational",
    },
    "temperature": [],
}


async def init_integration(
    hass,
    platform,
    printer: dict[str, Any] | UndefinedType | None = UNDEFINED,
    job: dict[str, Any] | None = None,
):
    """Set up the octoprint integration in Home Assistant."""
    printer_info: OctoprintPrinterInfo | None = None
    if printer is UNDEFINED:
        printer = DEFAULT_PRINTER
    if printer is not None:
        printer_info = OctoprintPrinterInfo(printer)
    if job is None:
        job = DEFAULT_JOB
    with patch("homeassistant.components.octoprint.PLATFORMS", [platform]), patch(
        "pyoctoprintapi.OctoprintClient.get_server_info", return_value={}
    ), patch(
        "pyoctoprintapi.OctoprintClient.get_printer_info",
        return_value=printer_info,
    ), patch(
        "pyoctoprintapi.OctoprintClient.get_job_info",
        return_value=OctoprintJobInfo(job),
    ), patch(
        "pyoctoprintapi.OctoprintClient.get_tracking_info",
        return_value=TrackingSetting({"unique_id": "uuid"}),
    ), patch(
        "pyoctoprintapi.OctoprintClient.get_discovery_info",
        return_value=DiscoverySettings({"upnpUuid": "uuid"}),
    ):
        config_entry = MockConfigEntry(
            domain=DOMAIN,
            entry_id="uuid",
            unique_id="uuid",
            data={
                "host": "1.1.1.1",
                "api_key": "test-key",
                "name": "OctoPrint",
                "port": 81,
                "ssl": True,
                "path": "/",
            },
            title="OctoPrint",
        )
        config_entry.add_to_hass(hass)

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

    assert config_entry.state == ConfigEntryState.LOADED