from scrapling.core._types import (
    Any,
    Dict,
    List,
    Set,
    Tuple,
    Sequence,
    Callable,
    Optional,
    SetCookieParam,
    SelectorWaitStates,
    FollowRedirects,
)

# Parameter definitions for shell function signatures (defined once at module level)
# Mirrors TypedDict definitions from _types.py but runtime-accessible for IPython introspection
_REQUESTS_PARAMS = {
    "params": Optional[Dict | List | Tuple],
    "cookies": Any,
    "auth": Optional[Tuple[str, str]],
    "impersonate": Any,
    "http3": Optional[bool],
    "stealthy_headers": Optional[bool],
    "proxies": Any,
    "proxy": Optional[str],
    "proxy_auth": Optional[Tuple[str, str]],
    "timeout": Optional[int | float],
    "headers": Any,
    "retries": Optional[int],
    "retry_delay": Optional[int],
    "follow_redirects": Optional[FollowRedirects],
    "max_redirects": Optional[int],
    "verify": Optional[bool],
    "cert": Optional[str | Tuple[str, str]],
    "selector_config": Optional[Dict],
}

_FETCH_PARAMS = {
    "headless": bool,
    "disable_resources": bool,
    "network_idle": bool,
    "load_dom": bool,
    "wait_selector": Optional[str],
    "wait_selector_state": SelectorWaitStates,
    "cookies": Sequence[SetCookieParam],
    "google_search": bool,
    "wait": int | float,
    "timezone_id": str | None,
    "page_action": Optional[Callable],
    "page_setup": Optional[Callable],
    "proxy": Optional[str | Dict[str, str] | Tuple],
    "extra_headers": Optional[Dict[str, str]],
    "timeout": int | float,
    "init_script": Optional[str],
    "user_data_dir": str,
    "selector_config": Optional[Dict],
    "additional_args": Optional[Dict],
    "locale": Optional[str],
    "real_chrome": bool,
    "cdp_url": Optional[str],
    "useragent": Optional[str],
    "extra_flags": Optional[List[str]],
    "blocked_domains": Optional[Set[str]],
    "block_ads": bool,
    "retries": int,
    "retry_delay": int | float,
    "capture_xhr": str | None,
    "executable_path": Optional[str],
    "dns_over_https": bool,
}

_STEALTHY_FETCH_PARAMS = {
    "headless": bool,
    "disable_resources": bool,
    "network_idle": bool,
    "load_dom": bool,
    "wait_selector": Optional[str],
    "wait_selector_state": SelectorWaitStates,
    "cookies": Sequence[SetCookieParam],
    "google_search": bool,
    "wait": int | float,
    "timezone_id": str | None,
    "page_action": Optional[Callable],
    "page_setup": Optional[Callable],
    "proxy": Optional[str | Dict[str, str] | Tuple],
    "extra_headers": Optional[Dict[str, str]],
    "timeout": int | float,
    "init_script": Optional[str],
    "user_data_dir": str,
    "selector_config": Optional[Dict],
    "additional_args": Optional[Dict],
    "locale": Optional[str],
    "real_chrome": bool,
    "cdp_url": Optional[str],
    "useragent": Optional[str],
    "extra_flags": Optional[List[str]],
    "blocked_domains": Optional[Set[str]],
    "block_ads": bool,
    "retries": int,
    "retry_delay": int | float,
    "capture_xhr": str | None,
    "executable_path": Optional[str],
    "dns_over_https": bool,
    "allow_webgl": bool,
    "hide_canvas": bool,
    "block_webrtc": bool,
    "solve_cloudflare": bool,
}

# Mapping of function names to their parameter definitions
Signatures_map = {
    "get": _REQUESTS_PARAMS,
    "post": {**_REQUESTS_PARAMS, "data": Optional[Dict | str], "json": Optional[Dict | List]},
    "put": {**_REQUESTS_PARAMS, "data": Optional[Dict | str], "json": Optional[Dict | List]},
    "delete": _REQUESTS_PARAMS,
    "fetch": _FETCH_PARAMS,
    "stealthy_fetch": _STEALTHY_FETCH_PARAMS,
}
