"""Diagnostics support for generic (IP camera)."""
from __future__ import annotations

from typing import Any

import yarl

from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant

from .const import CONF_STILL_IMAGE_URL, CONF_STREAM_SOURCE

TO_REDACT = {
    CONF_PASSWORD,
    CONF_USERNAME,
}


# A very similar redact function is in components.sql.  Possible to be made common.
def redact_url(data: str) -> str:
    """Redact credentials from string url."""
    url = url_in = yarl.URL(data)
    if url_in.user:
        url = url.with_user("****")
    if url_in.password:
        url = url.with_password("****")
    if url_in.path != "/":
        url = url.with_path("****")
    if url_in.query_string:
        url = url.with_query("****=****")
    return str(url)


async def async_get_config_entry_diagnostics(
    hass: HomeAssistant, entry: ConfigEntry
) -> dict[str, Any]:
    """Return diagnostics for a config entry."""
    options = async_redact_data(entry.options, TO_REDACT)
    for key in (CONF_STREAM_SOURCE, CONF_STILL_IMAGE_URL):
        if (value := options.get(key)) is not None:
            options[key] = redact_url(value)

    return {
        "title": entry.title,
        "data": async_redact_data(entry.data, TO_REDACT),
        "options": options,
    }
