import axios from 'axios';

/**
 * Получает user_token из глобального объекта TeleCart
 */
function getUserToken() {
  if (typeof window !== 'undefined' && window.TeleCart?.user_token) {
    return window.TeleCart.user_token;
  }

  // Fallback: пытаемся получить из URL как запасной вариант
  if (typeof window !== 'undefined') {
    const urlParams = new URLSearchParams(window.location.search);
    return urlParams.get('user_token') || '';
  }

  return '';
}

/**
 * Базовый URL для API запросов
 */
function getBaseUrl() {
  return '/admin/index.php';
}

/**
 * Создает URL для API запроса
 * @param {string} apiAction - действие API (например, 'configureBotToken')
 * @returns {string} полный URL
 */
function buildApiUrl(apiAction) {
  const baseUrl = getBaseUrl();
  const userToken = getUserToken();
  return `${baseUrl}?route=extension/module/tgshop/handle&api_action=${apiAction}&user_token=${userToken}`;
}

/**
 * HTTP клиент для работы с API
 */
const httpClient = axios.create({
  headers: {
    'Content-Type': 'application/json',
  },
});

/**
 * Выполняет POST запрос к API
 * @param {string} apiAction - действие API
 * @param {object} data - данные для отправки
 * @returns {Promise} результат запроса
 */
export async function apiPost(apiAction, data = {}) {
  const url = buildApiUrl(apiAction);

  try {
    const response = await httpClient.post(url, data);
    return {
      success: true,
      data: response.data,
      status: response.status,
    };
  } catch (error) {
    // Обработка ошибок axios
    if (error.response) {
      // Сервер вернул ошибку
      const status = error.response.status;
      const errorData = error.response.data;

      return {
        success: false,
        error: errorData?.error || error.response.statusText,
        status,
        data: errorData,
      };
    } else if (error.request) {
      // Запрос был отправлен, но ответа не получено
      return {
        success: false,
        error: 'Не удалось получить ответ от сервера',
        status: 0,
      };
    } else {
      // Ошибка при настройке запроса
      return {
        success: false,
        error: error.message || 'Произошла неизвестная ошибка',
        status: 0,
      };
    }
  }
}

/**
 * Выполняет GET запрос к API
 * @param {string} apiAction - действие API
 * @param {object} params - query параметры
 * @returns {Promise} результат запроса
 */
export async function apiGet(apiAction, params = {}) {
  const url = buildApiUrl(apiAction);

  try {
    const response = await httpClient.get(url, { params: params });
    return {
      success: true,
      data: response.data.data,
      status: response.status,
    };
  } catch (error) {
    if (error.response) {
      const status = error.response.status;
      const errorData = error.response.data;

      return {
        success: false,
        error: errorData?.error || error.response.statusText,
        status,
        data: errorData,
      };
    } else if (error.request) {
      return {
        success: false,
        error: 'Не удалось получить ответ от сервера',
        status: 0,
      };
    } else {
      return {
        success: false,
        error: error.message || 'Произошла неизвестная ошибка',
        status: 0,
      };
    }
  }
}

export default {
  apiPost,
  apiGet,
  getUserToken,
};

