"""Mock of resolved dbus service."""

from dbus_fast.service import PropertyAccess, dbus_property

from .base import DBusServiceMock

BUS_NAME = "org.freedesktop.resolve1"


def setup(object_path: str | None = None) -> DBusServiceMock:
    """Create dbus mock object."""
    return Resolved()


class Resolved(DBusServiceMock):
    """Resolved mock.

    gdbus introspect --system --dest org.freedesktop.resolve1 --object-path /org/freedesktop/resolve1
    """

    object_path = "/org/freedesktop/resolve1"
    interface = "org.freedesktop.resolve1.Manager"

    @dbus_property(access=PropertyAccess.READ)
    def LLMNRHostname(self) -> "s":
        """Get LLMNRHostname."""
        return "homeassistant"

    @dbus_property(access=PropertyAccess.READ)
    def LLMNR(self) -> "s":
        """Get LLMNR."""
        return "yes"

    @dbus_property(access=PropertyAccess.READ)
    def MulticastDNS(self) -> "s":
        """Get MulticastDNS."""
        return "resolve"

    @dbus_property(access=PropertyAccess.READ)
    def DNSOverTLS(self) -> "s":
        """Get DNSOverTLS."""
        return "no"

    @dbus_property(access=PropertyAccess.READ)
    def DNS(self) -> "a(iiay)":
        """Get DNS."""
        return [
            (0, 2, bytes([127, 0, 0, 1])),
            (
                0,
                10,
                bytes(
                    [
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x1,
                    ]
                ),
            ),
        ]

    @dbus_property(access=PropertyAccess.READ)
    def DNSEx(self) -> "a(iiayqs)":
        """Get DNSEx."""
        return [
            (0, 2, bytes([127, 0, 0, 1]), 0, ""),
            (
                0,
                10,
                bytes(
                    [
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x1,
                    ]
                ),
                0,
                "",
            ),
        ]

    @dbus_property(access=PropertyAccess.READ)
    def FallbackDNS(self) -> "a(iiay)":
        """Get FallbackDNS."""
        return [
            (0, 2, bytes([1, 1, 1, 1])),
            (
                0,
                10,
                bytes(
                    [
                        0x26,
                        0x6,
                        0x47,
                        0x0,
                        0x47,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x11,
                        0x11,
                    ]
                ),
            ),
        ]

    @dbus_property(access=PropertyAccess.READ)
    def FallbackDNSEx(self) -> "a(iiayqs)":
        """Get FallbackDNSEx."""
        return [
            (0, 2, bytes([1, 1, 1, 1]), 0, "cloudflare-dns.com"),
            (
                0,
                10,
                bytes(
                    [
                        0x26,
                        0x6,
                        0x47,
                        0x0,
                        0x47,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x0,
                        0x11,
                        0x11,
                    ]
                ),
                0,
                "cloudflare-dns.com",
            ),
        ]

    @dbus_property(access=PropertyAccess.READ)
    def CurrentDNSServer(self) -> "(iiay)":
        """Get CurrentDNSServer."""
        return (0, 2, bytes([127, 0, 0, 1]))

    @dbus_property(access=PropertyAccess.READ)
    def CurrentDNSServerEx(self) -> "(iiayqs)":
        """Get CurrentDNSServerEx."""
        return (0, 2, bytes([127, 0, 0, 1]), 0, "")

    @dbus_property(access=PropertyAccess.READ)
    def Domains(self) -> "a(isb)":
        """Get Domains."""
        return [(0, "local.hass.io", False)]

    @dbus_property(access=PropertyAccess.READ)
    def TransactionStatistics(self) -> "(tt)":
        """Get TransactionStatistics."""
        return (0, 100000)

    @dbus_property(access=PropertyAccess.READ)
    def CacheStatistics(self) -> "(ttt)":
        """Get CacheStatistics."""
        return (10, 50000, 10000)

    @dbus_property(access=PropertyAccess.READ)
    def DNSSEC(self) -> "s":
        """Get DNSSEC."""
        return "no"

    @dbus_property(access=PropertyAccess.READ)
    def DNSSECStatistics(self) -> "(tttt)":
        """Get DNSSECStatistics."""
        return (0, 0, 0, 0)

    @dbus_property(access=PropertyAccess.READ)
    def DNSSECSupported(self) -> "b":
        """Get DNSSECSupported."""
        return False

    @dbus_property(access=PropertyAccess.READ)
    def DNSSECNegativeTrustAnchors(self) -> "as":
        """Get DNSSECNegativeTrustAnchors."""
        return ["168.192.in-addr.arpa", "local"]

    @dbus_property(access=PropertyAccess.READ)
    def DNSStubListener(self) -> "s":
        """Get DNSStubListener."""
        return "no"

    @dbus_property(access=PropertyAccess.READ)
    def ResolvConfMode(self) -> "s":
        """Get ResolvConfMode."""
        return "foreign"
