# SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
#
# SPDX-License-Identifier: GPL-2.0-or-later

from pkcs11.exceptions import (
    AnotherUserAlreadyLoggedIn,
    ArgumentsBad,
    DeviceRemoved,
    DomainParamsInvalid,
    FunctionFailed,
    MechanismInvalid,
    NoSuchKey,
    NoSuchToken,
    OperationNotInitialized,
    SessionClosed,
)

from esptool.logger import log

try:
    # AlreadyInitialized is not available since python-pkcs11 9.0, as multiple
    # initializations are now supported.
    from pkcs11.exceptions import AlreadyInitialized
except ImportError:
    AlreadyInitialized = None


def handle_exceptions(e, info=""):
    exception_type = e.__class__
    if exception_type == MechanismInvalid:
        log.error(f"The External HSM does not support the given mechanism: {info}")
    elif exception_type == FunctionFailed:
        log.error(
            "Please ensure proper configuration, privileges and environment variables."
        )
    elif exception_type == AlreadyInitialized:
        log.error("pkcs11 is already initialized with another library.")
    elif exception_type == AnotherUserAlreadyLoggedIn:
        log.error("Another User has been already logged in.")
    elif exception_type == ArgumentsBad:
        log.error("Please check the arguments supplied to the function.")
    elif exception_type == DomainParamsInvalid:
        log.error(
            "Invalid or unsupported domain parameters were supplied to the function."
        )
    elif exception_type == DeviceRemoved:
        log.error(
            "The token has been removed from its slot during "
            "the execution of the function."
        )
    elif exception_type == NoSuchToken:
        log.error("No such token found.")
    elif exception_type == NoSuchKey:
        log.error("No such key found.")
    elif exception_type == OperationNotInitialized:
        log.error("Operation not initialized.")
    elif exception_type == SessionClosed:
        log.error("Session already closed.")
    else:
        log.error(f"{e.__class__}: {info}")
