import axios, { type AxiosError, type InternalAxiosRequestConfig } from 'axios';
import { API_BASE_URL } from '@/constants/app';
import { useAuthStore } from '@/stores/auth-store';

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

// Request interceptor - attach auth token
apiClient.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const token = useAuthStore.getState().access_token;
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error)
);

// Response interceptor - handle errors & logout on 401
apiClient.interceptors.response.use(
  (response) => {
    // Automatically reject if backend standard response indicates failure
    if (response.data && typeof response.data.isSuccess === 'boolean' && !response.data.isSuccess) {
      return Promise.reject(new Error(response.data.message || 'Terjadi kesalahan'));
    }
    return response;
  },
  async (error: AxiosError) => {
    // Extract error message from standard wrapper if available
    const errorData = error.response?.data as any;
    let customError = error;
    
    if (errorData && typeof errorData.isSuccess === 'boolean' && !errorData.isSuccess) {
      customError = new Error(errorData.message || 'Terjadi kesalahan') as any;
    }

    // Handle 401 Unauthorized (but not for login endpoint to prevent redirect loop)
    if (error.response?.status === 401 && !error.config?.url?.includes('/auth/login')) {
      useAuthStore.getState().logout();
      window.location.href = '/login';
    }

    return Promise.reject(customError);
  }
);

export default apiClient;
