import axios from 'axios';
import { useAuth } from '../auth'; // Импортируем функцию авторизации

// Создаем экземпляр Axios с базовым URL нашего API
// Настраиваем базовый URL в зависимости от окружения

// Определяем базовый URL в зависимости от среды выполнения
const getBaseUrl = () => {
  // Всегда используем относительный путь /api.
  // В режиме разработки Vite dev server будет проксировать эти запросы согласно настройке server.proxy в vite.config.js.
  // В продакшене предполагается, что веб-сервер (например, Nginx) настроен аналогично для обработки /api.
  // return '/api';
  return import.meta.env.VITE_API_BASE_URL; // Используем переменную окружения Vite
};

const apiClient = axios.create({
  baseURL: getBaseUrl(),
  headers: {
    'Content-Type': 'application/json',
  },
});

// (Опционально, но очень полезно) Перехватчик для добавления JWT токена к запросам
apiClient.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('userToken'); // Предполагаем, что токен хранится в localStorage
    if (token) {
      console.log('[API] Добавление токена к запросу:', config.url);
      config.headers['Authorization'] = `Bearer ${token}`;
    } else {
      console.log('[API] Токен не найден для запроса:', config.url);
    }
    return config;
  },
  (error) => {
    console.error('[API] Ошибка в перехватчике запросов:', error);
    return Promise.reject(error);
  }
);

// (Опционально) Перехватчик ответов для обработки глобальных ошибок, например, 401
apiClient.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response && error.response.status === 401) {
      console.error('[API] Неавторизованный запрос (401):', error.config.url);
      
      // Обходим замыкание, чтобы избежать проблем с импортом
      // При использовании такого подхода, logout будет вызван после текущего цикла выполнения JS
      setTimeout(() => {
        const { logout } = useAuth();
        logout();
      }, 0);
    }
    return Promise.reject(error);
  }
);


// Экспортируем функции для конкретных эндпоинтов
export default {
  register(userData) {
    return apiClient.post('/auth/register', userData);
  },
  login(credentials) {
    return apiClient.post('/auth/login', credentials);
  },
  getMe() { // Для получения данных пользователя
    return apiClient.get('/auth/me');
  },
  updateUserProfile(profileData) { 
    console.log('[API] Отправка запроса на обновление профиля:', profileData);
    return apiClient.put('/users/profile', profileData);
  },
  getSuggestions() {
    return apiClient.get('/users/suggestions');
  },
  likeUser(userId) {
    return apiClient.post(`/actions/like/${userId}`);
  },
  passUser(userId) {
    return apiClient.post(`/actions/pass/${userId}`);
  },
  uploadUserProfilePhoto(formData) {
    return apiClient.post('/users/profile/photo', formData, {
      headers: {
        'Content-Type': 'multipart/form-data', // Важно для FormData
      },
    });
  },
  // Новые методы для управления фотографиями
  setMainPhoto(photoId) {
    return apiClient.put(`/users/profile/photo/${photoId}/set-main`);
  },
  deletePhoto(photoId) {
    return apiClient.delete(`/users/profile/photo/${photoId}`);
  },
  getUserConversations() {
    return apiClient.get('/conversations'); // GET /api/conversations
  },
  getMessagesForConversation(conversationId) {
    return apiClient.get(`/conversations/${conversationId}/messages`); // GET /api/conversations/:id/messages
  },
  deleteMessage(conversationId, messageId) {
    return apiClient.delete(`/conversations/${conversationId}/messages/${messageId}`);
  },
  editMessage(conversationId, messageId, newText) {
    return apiClient.put(`/conversations/${conversationId}/messages/${messageId}`, { text: newText });
  }
};