namespace PARR.Domain.Exceptions
{
    /// <summary>
    /// Базовый класс для всех ошибок
    /// </summary>
    public abstract class BaseException : Exception
    {
        protected BaseException(string message) : base(message) { }
    }

    /// <summary>
    /// Ошибка БД. 502
    /// </summary>
    public class DbErrorException : BaseException
    {
        /// <summary>
        /// Ошибка БД.
        /// </summary>
        /// <param name="message"></param>
        public DbErrorException(string message) : base(message) { }
    }

    /// <summary>
    /// Объект не найден. 404
    /// </summary>
    public class NotFoundException : BaseException
    {
        /// <summary>
        /// Объект не найден.
        /// </summary>
        /// <param name="message"></param>
        public NotFoundException(string message) : base(message) { }
    }

    /// <summary>
    /// Ошибка валидации. 400.
    /// Использовать эту ошибку, если не подходит валидация от Fluent (ValidationException)
    /// </summary>
    public class AppValidationException : BaseException
    {
        /// <summary>
        /// Ошибка валидации.
        /// </summary>
        /// <param name="message"></param>
        public AppValidationException(string message) : base(message) { }
    }

    /// <summary>
    /// Объект уже существует. 409
    /// </summary>
    public class AlreadyExistsException : BaseException
    {
        /// <summary>
        /// Объект уже существует.
        /// </summary>
        /// <param name="message"></param>
        public AlreadyExistsException(string message) : base(message) { }
    }

    /// <summary>
    /// Ошибка при работе с внешним сервисом. 502
    /// </summary>
    public class ExternalServiceException : BaseException
    {
        /// <summary>
        /// Ошибка при работе с внешним сервисом.
        /// </summary>
        /// <param name="message"></param>
        public ExternalServiceException(string message) : base(message) { }
    }

    /// <summary>
    /// Пользователь не аутентифицирован. 401
    /// </summary>
    public class UnauthorizedException : BaseException
    {
        /// <summary>
        /// Пользователь не аутентифицирован.
        /// </summary>
        /// <param name="message"></param>
        public UnauthorizedException(string message) : base(message) { }
    }

    /// <summary>
    /// Доступ запрещен. 403.
    /// Пользователь вошел в систему (мы знаем, кто он), но у него нет прав на конкретное действие или объект.
    /// </summary>
    public class ForbiddenException : BaseException
    {
        /// <summary>
        /// Доступ запрещен.
        /// </summary>
        /// <param name="message"></param>
        public ForbiddenException(string message) : base(message) { }
    }

    /// <summary>
    /// Ошибка при расчете NextRun. 422 (запрос валиден, но бизнес логика не смогла нормально его обработать)
    /// </summary>
    public class NextRunException : BaseException
    {
        /// <summary>
        /// Ошибка при расчете NextRun
        /// </summary>
        /// <param name="message"></param>
        public NextRunException(string message) : base(message){}
    }

}
