using System.ComponentModel.DataAnnotations;
using Persistence.Client.CustomExceptions;
using Refit;

namespace Persistence.Client.Helpers;
public static class ExceptionsHelper
{
    private static readonly Dictionary<System.Net.HttpStatusCode, Exception> ExceptionsDictionary = new Dictionary<System.Net.HttpStatusCode, Exception>()
    {
        { System.Net.HttpStatusCode.BadRequest, new ValidationException("Ошибка валидации, формата или маршрутизации запроса") },
        { System.Net.HttpStatusCode.Unauthorized, new UnauthorizedAccessException("Ошибка авторизации, клиент должен аутентифицировать себя, чтобы получить запрошенный ответ") },
        { System.Net.HttpStatusCode.Forbidden, new ForbiddenException("Клиент известен серверу, но он неавторизован") },
        { System.Net.HttpStatusCode.NotFound, new EntryPointNotFoundException("Сервер не может найти запрошенный ресурс") },
        { System.Net.HttpStatusCode.MethodNotAllowed, new MethodAccessException("Обращение запрещено") },
        { System.Net.HttpStatusCode.NotAcceptable, new AcceptableException("После выполнения согласования контента не найдено содержимого, соответствующего заданным критериям") },
        { System.Net.HttpStatusCode.RequestTimeout, new TimeoutException("Время ожидания истекло") },
        { System.Net.HttpStatusCode.Locked, new LockedException("Запрашиваемый ресурс заблокирован") },
        { System.Net.HttpStatusCode.TooManyRequests, new TooManyRequestsException("Пользователь отправил слишком много запросов в определённый промежуток времени") },
        { System.Net.HttpStatusCode.InternalServerError, new InternalServerException("На сервере произошла ошибка, в результате которой он не может успешно обработать запрос") },
        { System.Net.HttpStatusCode.NotImplemented, new NotImplementedException("Метод запроса не поддерживается сервером") },
        { System.Net.HttpStatusCode.BadGateway, new BadGatewayException("В процессе обработки запроса полуен недопустимый ответ от целевого сервера") },
        { System.Net.HttpStatusCode.ServiceUnavailable, new ServiceUnavailableException("В процессе обработки запроса полуен недопустимый ответ от целевого сервера") },
        { System.Net.HttpStatusCode.GatewayTimeout, new TimeoutException("Время ожидания целевого сервера истекло") }
    };

    public static Exception GetPersistenceException(this IApiResponse response)
    {
        ExceptionsDictionary
            .TryGetValue(response.StatusCode, out var exception);

        var result = exception ?? new Exception("Неопознанная ошибка");

		return result;
    }
}