/**
 * Axios configuration with interceptors
 */

import axios, { AxiosInstance, InternalAxiosRequestConfig } from 'axios';
import { env } from './env';

// Create axios instance
const axiosInstance: AxiosInstance = axios.create({
  baseURL: env.apiUrl,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  },
});

// Request interceptor - Add authorization token to all requests
axiosInstance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // Add Strapi token if available
    if (env.strapiToken) {
      config.headers.Authorization = `Bearer ${env.strapiToken}`;
    }

    // Log request for debugging (remove in production)
    if (process.env.NODE_ENV === 'development') {
      console.log('🚀 API Request:', {
        method: config.method?.toUpperCase(),
        url: config.url,
        baseURL: config.baseURL,
        hasAuth: !!config.headers.Authorization,
      });
    }

    return config;
  },
  (error) => {
    console.error('❌ Request Error:', error);
    return Promise.reject(error);
  }
);

// Response interceptor - Handle responses and errors
axiosInstance.interceptors.response.use(
  (response) => {
    // Log response for debugging (remove in production)
    if (process.env.NODE_ENV === 'development') {
      console.log('✅ API Response:', {
        status: response.status,
        url: response.config.url,
        data: response.data,
      });
    }

    return response;
  },
  (error) => {
    // Handle errors
    if (error.response) {
      // Server responded with error status
      console.error('❌ API Error Response:', {
        status: error.response.status,
        data: error.response.data,
        url: error.config?.url,
      });

      // Handle specific error codes
      switch (error.response.status) {
        case 401:
          console.error('Unauthorized - Check your Strapi token');
          break;
        case 403:
          console.error('Forbidden - Insufficient permissions');
          break;
        case 404:
          console.error('Not Found - Endpoint does not exist');
          break;
        case 500:
          console.error('Server Error - Strapi internal error');
          break;
      }
    } else if (error.request) {
      // Request was made but no response received
      console.error('❌ No Response:', error.message);
    } else {
      // Something else happened
      console.error('❌ Request Setup Error:', error.message);
    }

    return Promise.reject(error);
  }
);

export default axiosInstance;

