import platform
import sys


def _check_tensor_gpu_index():
    try:
        import pynvml
        pynvml.nvmlInit()
        device_count = pynvml.nvmlDeviceGetCount()
        if device_count == 0:
            return -1
        for i in range(device_count):
            handle = pynvml.nvmlDeviceGetHandleByIndex(i)
            major, minor = pynvml.nvmlDeviceGetCudaComputeCapability(handle)
            if major > 6 or (major == 6 and minor >= 1):
                return i
        return -1
    except Exception:
        return -1
    finally:
        try:
            import pynvml
            pynvml.nvmlShutdown()
        except Exception:
            pass


def _is_apple_silicon():
    if sys.platform != "darwin" or platform.machine() != "arm64":
        return False
    try:
        import coremltools
        return True
    except ImportError:
        return False


tensor_gpu_index = _check_tensor_gpu_index()


def _select_engine_class():
    if tensor_gpu_index > -1:
        from engines.tensorrt_engine import TensorRTEngine  # pyright: ignore[reportMissingImports]
        return TensorRTEngine
    if _is_apple_silicon():
        from engines.coreml_engine import CoreMLEngine
        return CoreMLEngine
    from engines.onnx_engine import OnnxEngine
    return OnnxEngine


EngineClass = _select_engine_class()
