import axios from 'axios';

const api = axios.create({
  baseURL: `/epby-mock`,
});
class ResponseApi {
  message = '';
  description = '';
  code = 0;
  embedded = '';
  date = '';

  constructor(message, code, embedded, date) {
    this.message = message;
    this.code = code;
    this.embedded = embedded;
    this.date = date;
  }
}

/**
 * Функция вызова API с обработчиком ошибок ответов
 * @param API  {Class} - объект класса
 * @param req {string} - вызываемый метод из объекта API
 * @param options - параметры передаваемые в метод
 * @returns {Promise<any>} - ответ
 */
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const requestApi = (API, req, options) => {
  return new Promise((resolve, reject) => {
    API[req](options)
      .then((response) => {
        resolve(new ResponseApi(response.data, 200));
      })
      .catch((error) => {
        console.log(error)
        console.log(error.response)
        const err = new ResponseApi();
        if (error.message === 'Network Error') {
          err.code = 300;
          err.date = new Date();
          err.message = 'Ошибка сети';
          err.description =
            'Отсутствует соединение с сервером. Для устранения причины обратитесь к администратору сети.';
        } else {
          switch (error.response.status) {
            case 400: // Серверное событие error
              err.date = error.response.headers.date;
              err.message = 'Ошибка корректности входных данных';
              err.description = 'Проверьте правильность указанных данных';
              err.embedded = error.response?.data?._embedded;
              break;
            case 401:
            case 403:
              err.date = error.response.headers.date;
              err.message = 'Ошибка авторизации';
              err.description =
                'Время Ваше авторизации в системе истекло' +
                ' необходимо повторно авторизоваться в системе';
              break;
            case 404:
              err.date = error.response.headers.date;
              err.message = 'Заданный узел недоступен';
              err.description =
                'При проверке связи не удалось обнаружить узел. Попробуйте повторить позже.';
              break;
            case 500:
              err.date = error.response.headers.date;
              err.embedded = error.response.data;
              err.message =
                'Возникла ошибка сетевого соединения. Удаленный сервер недоступен.' +
                ' Проверьте сетевое соединение или обратитесь к системному администратору';
              break;
            case 503:
              err.message =
                'Сервис временно недоступен, попробуйте повторить позже';
              err.date = error.response.headers.date;
              break;
            case 504: // GetWay TimeOut ответ
              err.date = error.response.headers.date;
              err.message = 'Превышено время ожидания ответа сервера.';
              err.description =
                'Проверьте скорость и стабильность вашего интернет соединения. ' +
                ' В случае повторного возникновения ошибки, обратитесь к системному администратору';
              break;
            case 406: // Такой файл уже загружали
              err.date = error.response.headers.date;
              err.message = error.response.data.message;
              err.embedded = error.response.data.errors;
              break;
            case 494: // Ошибки в момент валидации файла
              err.date = error.response.headers.date;
              err.message = 'Ошибка валидации файла';
              err.description =
                'Проверьте правильность указанных данных в файле';
              err.embedded = error.response.data.errors;
              break;
            case 510: // Ошибка чтения файла (некорректная xml)
              err.date = error.response.headers.date;
              err.message = 'Ошибка структуры файла';
              err.description =
                'Загружаемый файл имеет некорректную структуру и не может быть загружен';
              err.embedded = error.response.data.errors;
              break;
            case 450:
              err.date = error.response.headers.date;
              err.message = 'Имя файла не соответствует формату';
              err.description =
                'Пример корректного имени файла:\n' +
                'A_GIR01_202307261605_123.xml, H_GIR01_202307261605_123.xml';
              err.embedded = error.response.data.errors;
              break;
            default:
              // Ответ для неопознанной ошибке
              err.date = error.response.headers.date;
              err.message = 'Возникла непредвиденная ошибка';
              err.description =
                'Попробуйте повторить позже или обратитесь в службу поддержки';
          }
        }
        reject(err);
      });
  });
};

function responseData(requestPromise) {
  return requestPromise.then((response) => response.data);
}

export const lists = {
  get(listId) {
    return responseData(api.get(`/list/${encodeURIComponent(listId)}`));
  },
  search(params) {
    return responseData(api.post('/list/search', params));
  },
  add(listId, recruitIds) {
    return responseData(
      api.put(`/list/${encodeURIComponent(listId)}/add`, { recruitIds })
    );
  },
  remove(listId, recruitIds) {
    return responseData(
      api.put(`/list/${encodeURIComponent(listId)}/remove`, { recruitIds })
    );
  },
  new(title, recruitIds) {
    return responseData(api.post(`/list/new`, { title, recruitIds }));
  },
};
