"""
Gathers all exceptions thrown by ormar.
"""


class AsyncOrmException(Exception):
    """
        Base ormar Exception
    """

    pass


class ModelDefinitionError(AsyncOrmException):
    """
        Raised for errors related to the model definition itself:

        * setting @property_field on method with arguments other than func(self)
        * defining a Field without required parameters
        * defining a model with more than one primary_key
        * defining a model without primary_key
        * setting primary_key column as pydantic_only
    """

    pass


class ModelError(AsyncOrmException):
    """
        Raised for initialization of model with non-existing field keyword.
    """

    pass


class NoMatch(AsyncOrmException):
    """
        Raised for database queries that has no matching result (empty result).
    """

    pass


class MultipleMatches(AsyncOrmException):
    """
        Raised for database queries that should return one row (i.e. get, first etc.)
        but has multiple matching results in response.
    """

    pass


class QueryDefinitionError(AsyncOrmException):
    """
        Raised for errors in query definition:

        * using contains or icontains filter with instance of the Model
        * using Queryset.update() without filter and setting each flag to True
        * using Queryset.delete() without filter and setting each flag to True
    """

    pass


class RelationshipInstanceError(AsyncOrmException):
    pass


class ModelPersistenceError(AsyncOrmException):
    """
        Raised for update of models without primary_key set (cannot retrieve from db)
        or for saving a model with relation to unsaved model (cannot extract fk value).
    """

    pass


class SignalDefinitionError(AsyncOrmException):
    """
        Raised when non callable receiver is passed as signal callback.
    """

    pass
