"""Provides a pretty-printing widget."""

from __future__ import annotations

from typing import Any

from rich.pretty import Pretty as PrettyRenderable

from textual.app import RenderResult
from textual.widget import Widget


class Pretty(Widget):
    """A pretty-printing widget.

    Used to pretty-print any object.
    """

    DEFAULT_CSS = """
    Pretty {
        height: auto;
    }
    """

    def __init__(
        self,
        object: Any,
        *,
        name: str | None = None,
        id: str | None = None,
        classes: str | None = None,
    ) -> None:
        """Initialise the `Pretty` widget.

        Args:
            object: The object to pretty-print.
            name: The name of the pretty widget.
            id: The ID of the pretty in the DOM.
            classes: The CSS classes of the pretty.
        """
        super().__init__(name=name, id=id, classes=classes)
        self.shrink = False
        self._pretty_renderable = PrettyRenderable(object)

    def render(self) -> RenderResult:
        return self._pretty_renderable

    def update(self, object: object) -> None:
        """Update the content of the pretty widget.

        Args:
            object: The object to pretty-print.
        """
        self._pretty_renderable = PrettyRenderable(object)
        self.clear_cached_dimensions()
        self.refresh(layout=True)
