"""
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
