"""The resolution center websocket API."""
from __future__ import annotations

import dataclasses
from typing import Any

import voluptuous as vol

from homeassistant.components import websocket_api
from homeassistant.core import HomeAssistant, callback

from .issue_handler import async_dismiss_issue
from .issue_registry import async_get as async_get_issue_registry


@callback
def async_setup(hass: HomeAssistant) -> None:
    """Set up the resolution center websocket API."""
    websocket_api.async_register_command(hass, ws_dismiss_issue)
    websocket_api.async_register_command(hass, ws_list_issues)


@callback
@websocket_api.websocket_command(
    {
        vol.Required("type"): "resolution_center/dismiss_issue",
        vol.Required("domain"): str,
        vol.Required("issue_id"): str,
    }
)
def ws_dismiss_issue(
    hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict
) -> None:
    """Fix an issue."""
    async_dismiss_issue(hass, msg["domain"], msg["issue_id"])

    connection.send_result(msg["id"])


@websocket_api.websocket_command(
    {
        vol.Required("type"): "resolution_center/list_issues",
    }
)
@callback
def ws_list_issues(
    hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict
) -> None:
    """Return a list of issues."""

    def ws_dict(kv_pairs: list[tuple[Any, Any]]) -> dict[Any, Any]:
        result = {k: v for k, v in kv_pairs if k != "active"}
        result["dismissed"] = result["dismissed_version"] is not None
        return result

    issue_registry = async_get_issue_registry(hass)
    issues = [
        dataclasses.asdict(issue, dict_factory=ws_dict)
        for issue in issue_registry.issues.values()
    ]

    connection.send_result(msg["id"], {"issues": issues})