import axios from 'axios' import type { AxiosInstance, InternalAxiosRequestConfig } from 'axios' import { useAuthStore } from '@/stores/useAuthStore' import { useNotificationStore } from '@/stores/useNotificationStore' import { useOrganisationStore } from '@/stores/useOrganisationStore' const apiClient: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_URL, withCredentials: true, headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, timeout: 30000, }) apiClient.interceptors.request.use( (config: InternalAxiosRequestConfig) => { const authStore = useAuthStore() const orgStore = useOrganisationStore() if (authStore.token) { config.headers.Authorization = `Bearer ${authStore.token}` } if (orgStore.activeOrganisationId) { config.headers['X-Organisation-Id'] = orgStore.activeOrganisationId } if (import.meta.env.DEV) { console.log(`🚀 ${config.method?.toUpperCase()} ${config.url}`, config.data) } return config }, error => Promise.reject(error), ) apiClient.interceptors.response.use( response => { if (import.meta.env.DEV) { console.log(`✅ ${response.status} ${response.config.url}`, response.data) } return response }, error => { if (import.meta.env.DEV) { console.error(`❌ ${error.response?.status} ${error.config?.url}`, error.response?.data) } const status = error.response?.status const notificationStore = useNotificationStore() if (status === 401) { const authStore = useAuthStore() // During initialization, let initialize() handle the 401 — skip redirect if (authStore.isInitialized) { authStore.logout() if (typeof window !== 'undefined' && window.location.pathname !== '/login') { window.location.href = '/login' } } } else if (status === 403) { notificationStore.show('You don\'t have permission for this action.', 'error') } else if (status === 404) { notificationStore.show('The requested item was not found.', 'warning') } else if (status === 422) { // Validation errors — pass through to calling component } else if (status === 503) { notificationStore.show('Service temporarily unavailable. Please try again later.', 'error') } else if (status && status >= 500) { notificationStore.show('An unexpected error occurred. Please try again later.', 'error') } else if (!error.response) { // Network error — no response received notificationStore.show('Unable to connect to the server. Check your internet connection.', 'error') } return Promise.reject(error) }, ) export { apiClient }