import axios from "axios";
import { dbManager } from "../utils/indexedDB";

const axiosClient = axios.create({
  baseURL: "/api",
  withCredentials: true,
  headers: {
    "Content-Type": "application/json",
  },
});

// Добавляем interceptor для логирования запросов (для отладки)
axiosClient.interceptors.request.use(
  (config) => {
    console.log("API Request:", config.method?.toUpperCase(), config.url);
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

axiosClient.interceptors.response.use(
  (response) => {
    console.log("API Response:", response.status, response.config.url);
    return response;
  },
  (error) => {
    console.error("API Error:", {
      url: error.config?.url,
      status: error.response?.status,
      message: error.message,
      data: error.response?.data,
    });

    if (error.response?.status === 401) {
      // Список URL, где 401 означает неправильный пароль, а не истечение сессии
      const passwordProtectedUrls = [
        "/login", // Страница входа
        "/register", // Страница регистрации
        "/notes/archived/all", // Удаление всех архивных заметок
        "/user/delete-account", // Удаление аккаунта
        "/user/2fa/verify", // Проверка 2FA кода
        "/user/2fa/disable", // Отключение 2FA
      ];

      // URL, где 401 не должен обрабатываться как ошибка сессии
      const statusCheckUrls = [
        "/auth/status", // Проверка статуса аутентификации
      ];

      // Проверяем, является ли это запросом с проверкой пароля
      const isPasswordProtected = passwordProtectedUrls.some((url) =>
        error.config?.url?.includes(url)
      );

      // Проверяем, является ли это запросом проверки статуса
      const isStatusCheck = statusCheckUrls.some((url) =>
        error.config?.url?.includes(url)
      );

      // Разлогиниваем только если это НЕ запрос с проверкой пароля и НЕ проверка статуса
      if (!isPasswordProtected && !isStatusCheck) {
        // Очищаем IndexedDB при автоматическом разлогинивании
        dbManager.clearAll().catch((err) => {
          console.error("Ошибка очистки IndexedDB при 401:", err);
        });
        localStorage.removeItem("isAuthenticated");
        window.location.href = "/";
      }
    }

    // Если это ошибка сети (нет ответа от сервера)
    if (!error.response) {
      console.error(
        "Network error - server might be down or proxy not working"
      );
    }

    return Promise.reject(error);
  }
);

export default axiosClient;
