from __future__ import annotations

import os
import sys
from typing import Final

# Earliest fully supported Python 3.x version. Used as the default Python
# version in tests. Mypy wheels should be built starting with this version,
# and CI tests should be run on this version (and later versions).
PYTHON3_VERSION: Final = (3, 10)

# Earliest Python 3.x version supported via --python-version 3.x. To run
# mypy, at least version PYTHON3_VERSION is needed.
PYTHON3_VERSION_MIN: Final = (3, 10)  # Keep in sync with supported target versions

CACHE_DIR: Final = ".mypy_cache"
SQLITE_NUM_SHARDS: Final = 16

CONFIG_NAMES: Final = ["mypy.ini", ".mypy.ini"]
SHARED_CONFIG_NAMES: Final = ["pyproject.toml", "setup.cfg"]

USER_CONFIG_FILES: list[str] = ["~/.config/mypy/config", "~/.mypy.ini"]
if os.environ.get("XDG_CONFIG_HOME"):
    USER_CONFIG_FILES.insert(0, os.path.join(os.environ["XDG_CONFIG_HOME"], "mypy/config"))
USER_CONFIG_FILES = [os.path.expanduser(f) for f in USER_CONFIG_FILES]

# This must include all reporters defined in mypy.report. This is defined here
# to make reporter names available without importing mypy.report -- this speeds
# up startup.
REPORTER_NAMES: Final = [
    "linecount",
    "any-exprs",
    "linecoverage",
    "memory-xml",
    "cobertura-xml",
    "xml",
    "xslt-html",
    "xslt-txt",
    "html",
    "txt",
    "lineprecision",
]

# Threshold after which we sometimes filter out most errors to avoid very
# verbose output. The default is to show all errors.
MANY_ERRORS_THRESHOLD: Final = -1

RECURSION_LIMIT: Final = 2**14

# It looks like Windows is slow with processes, causing test flakiness even
# with our generous timeouts, so we set them higher.
WORKER_START_INTERVAL: Final = 0.01 if sys.platform != "win32" else 0.03
WORKER_START_TIMEOUT: Final = 3 if sys.platform != "win32" else 10
WORKER_SHUTDOWN_TIMEOUT: Final = 1 if sys.platform != "win32" else 3

WORKER_CONNECTION_TIMEOUT: Final = 10
WORKER_IDLE_TIMEOUT: Final = 600
WORKER_DONE_TIMEOUT: Final = 600
