import os
import sys
import warnings
from logging import (
    DEBUG,
    INFO,
    FileHandler,
    StreamHandler,
    basicConfig,
    captureWarnings,
    getLogger,
)
from pathlib import Path

from rich.logging import RichHandler

LOGGER_INIT = False


def init_logger() -> None:
    global LOGGER_INIT
    if LOGGER_INIT:
        return

    IS_TEST = "test" in Path.cwd().stem
    package_name = sys.modules[__name__].__package__
    basicConfig(
        level=INFO,
        format="%(asctime)s %(message)s",
        datefmt="[%X]",
        handlers=[
            StreamHandler() if is_notebook() else RichHandler(),
            FileHandler(f"{package_name}.log"),
        ],
    )
    if IS_TEST:
        getLogger(package_name).setLevel(DEBUG)
    captureWarnings(True)
    warnings.filterwarnings(
        "ignore", category=UserWarning, message="TypedStorage is deprecated"
    )
    LOGGER_INIT = True


def is_notebook():
    try:
        from IPython import get_ipython

        if "IPKernelApp" not in get_ipython().config:  # pragma: no cover
            raise ImportError("console")
            return False
        if "VSCODE_PID" in os.environ:  # pragma: no cover
            raise ImportError("vscode")
            return False
    except Exception:
        return False
    else:  # pragma: no cover
        return True
