# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Interactive display objects for BigQuery DataFrames."""

from __future__ import annotations

from typing import Any


def __getattr__(name: str) -> Any:
    """Lazily import TableWidget to avoid ZMQ port conflicts.

    anywidget and traitlets eagerly initialize kernel communication channels on
    import. This can lead to race conditions and ZMQ port conflicts when
    multiple Jupyter kernels are started in parallel, such as during notebook
    tests. By using __getattr__, we defer the import of TableWidget until it is
    explicitly accessed, preventing premature initialization and avoiding port
    collisions.
    """
    if name == "TableWidget":
        try:
            import anywidget  # noqa

            from bigframes.display.anywidget import TableWidget

            return TableWidget
        except Exception:
            raise AttributeError(
                f"module '{__name__}' has no attribute '{name}'. "
                "TableWidget requires anywidget and traitlets to be installed. "
                "Please `pip install anywidget traitlets` or `pip install 'bigframes[anywidget]'`."
            )
    raise AttributeError(f"module '{__name__}' has no attribute '{name}'")


__all__ = ["TableWidget"]
