from enum import Enum, auto
from typing import List


class AutoNameEnum(str, Enum):
    def _generate_next_value_(  # type: ignore
            name: str, start: int, count: int, last_values: List[str]
    ) -> str:
        return name.lower()


class Options(AutoNameEnum):
    BULK_SIZE = auto()
    BULK_FLUSH_INTERVAL = auto()
    MAX_CONCURRENCY = auto()
    CONNECTION_FAIL_CALLBACK = auto()


class Actions(AutoNameEnum):
    ACK = auto()
    REJECT = auto()
    REQUEUE = auto()
    REQUEUE_TAIL = auto()


class Events(AutoNameEnum):
    ON_SUCCESS = auto()
    ON_EXCEPTION = auto()


class DefaultValues:
    MAX_SUBMIT_WORKER_SIZE = 8
    BULK_SIZE = 1
    BULK_FLUSH_INTERVAL = 60
    ON_SUCCESS = Actions.ACK
    ON_EXCEPTION = Actions.REQUEUE_TAIL
    RUN_EVERY_MAX_CONCURRENCY = 1


class RouteTypes(AutoNameEnum):
    AMQP_RABBITMQ = auto()
    HTTP = auto()
