from typing import TYPE_CHECKING

from ._lazy_loader import attach as lazy_attach
from ._lazy_loader import attach_stub

if TYPE_CHECKING:
    from ._dataframe import (
        convert_df_columns_to_datetime,
        convert_df_columns_to_datetime_by_idx,
        convert_df_columns_to_datetime_re,
        convert_dtypes,
        convert_str_to_timestamp,
    )
    from ._common import (
        ArgsParser,
        attributes_arg_parser,
        bool_or_none_to_str,
        cached_property,
        CallbackHandler,
        custom_insts_historical_universe_parser,
        EnumArgsParser,
        extend_params,
        fields_arg_parser,
        get_correct_filename,
        get_from_path,
        get_list_from_path,
        get_response_reason,
        hp_universe_parser,
        is_all_same_type,
        iterator_str_arg_parser,
        lazy_dump,
        lazy_formatting,
        make_convert_to_enum,
        make_convert_to_enum_arg_parser,
        make_counter,
        make_enum_arg_parser,
        make_enum_arg_parser_by_members,
        make_parse_enum,
        merge_dict_to_dict,
        ohlc,
        OrEvent,
        RepeatedTimer,
        universe_arg_parser,
        urljoin,
        validate_bool_value,
        validate_types,
        NotNoneList,
    )

    from ._converter import try_copy_to_list, Copier
    from ._datetime import (
        add_periods_datetime_adapter,
        cfs_datetime_adapter,
        convert_to_datetime,
        Converter,
        custom_inst_datetime_adapter,
        filling_search_datetime_adapter,
        fr_datetime_adapter,
        hp_datetime_adapter,
        ipa_date_adapter,
        ipa_datetime_adapter,
        ipa_datetime_adapter,
        NanosecondsFormatter,
        ownership_datetime_adapter,
        to_iso_format,
    )
    from ._debug import DEBUG
    from ._params import ParamItem, ValueParamItem, SerParamItem, get_params, is_date_true
    from ._patterns import (
        ADC_FUNC_PATTERN,
        ADC_TR_F_FUNC_PATTERN,
        ADC_TR_F_FUNC_WITH_DATE_PATTERN,
        ADC_TR_PATTERN,
        HEADER_NAME_DATE_PATTERN,
        HEADER_TITLE_DATE_PATTERN,
        DATE_SUBSTRINGS,
        PRICING_DATETIME_PATTERN,
    )
    from ._repr import create_repr, get_new_path
    from ._utils import (
        fill,
        has_any_substrings,
        inspect_parameters_without_self,
        parse_url,
        quotes,
        validate_endpoint_request_url_parameters,
        version_to_tuple,
        get_unique_dict,
        get_unique_list,
    )
    from ._specification import BaseSpecification, AndSpecification, OrSpecification, NotSpecification
    from ._delays import get_delays, MINUTES_10, MINUTES_15
    from .templates import OldStyleStringTemplate, StringTemplate

_submod_attrs = {
    "_dataframe": [
        "convert_df_columns_to_datetime",
        "convert_df_columns_to_datetime_by_idx",
        "convert_df_columns_to_datetime_re",
        "convert_dtypes",
        "convert_str_to_timestamp",
    ],
    "_common": [
        "ArgsParser",
        "attributes_arg_parser",
        "bool_or_none_to_str",
        "cached_property",
        "CallbackHandler",
        "custom_insts_historical_universe_parser",
        "EnumArgsParser",
        "extend_params",
        "fields_arg_parser",
        "get_correct_filename",
        "get_from_path",
        "get_list_from_path",
        "get_response_reason",
        "hp_universe_parser",
        "is_all_same_type",
        "iterator_str_arg_parser",
        "lazy_dump",
        "lazy_formatting",
        "make_convert_to_enum",
        "make_convert_to_enum_arg_parser",
        "make_counter",
        "make_enum_arg_parser",
        "make_enum_arg_parser_by_members",
        "make_parse_enum",
        "merge_dict_to_dict",
        "ohlc",
        "OrEvent",
        "RepeatedTimer",
        "universe_arg_parser",
        "urljoin",
        "validate_bool_value",
        "validate_types",
        "NotNoneList",
    ],
    "_converter": ["try_copy_to_list", "Copier"],
    "_datetime": [
        "add_periods_datetime_adapter",
        "cfs_datetime_adapter",
        "convert_to_datetime",
        "Converter",
        "custom_inst_datetime_adapter",
        "filling_search_datetime_adapter",
        "fr_datetime_adapter",
        "hp_datetime_adapter",
        "ipa_date_adapter",
        "ipa_datetime_adapter",
        "NanosecondsFormatter",
        "ownership_datetime_adapter",
        "to_iso_format",
    ],
    "_debug": ["DEBUG"],
    "_params": ["ParamItem", "ValueParamItem", "SerParamItem", "get_params", "is_date_true"],
    "_patterns": [
        "ADC_FUNC_PATTERN",
        "ADC_TR_F_FUNC_PATTERN",
        "ADC_TR_F_FUNC_WITH_DATE_PATTERN",
        "ADC_TR_PATTERN",
        "HEADER_NAME_DATE_PATTERN",
        "HEADER_TITLE_DATE_PATTERN",
        "DATE_SUBSTRINGS",
        "PRICING_DATETIME_PATTERN",
    ],
    "_repr": ["create_repr", "get_new_path"],
    "_utils": [
        "camel_to_snake",
        "fill",
        "get_unique_dict",
        "get_unique_list",
        "has_any_substrings",
        "inspect_parameters_without_self",
        "parse_url",
        "quotes",
        "validate_endpoint_request_url_parameters",
        "version_to_tuple",
    ],
    "_specification": ["BaseSpecification", "AndSpecification", "OrSpecification", "NotSpecification"],
    "_delays": ["get_delays", "MINUTES_10", "MINUTES_15", "Delays"],
    "templates": ["OldStyleStringTemplate", "StringTemplate"],
}

__getattr__, __dir__, __all__ = lazy_attach(__name__, submod_attrs=_submod_attrs)
