import axios from 'axios'
import { useUsersStore } from '@/stores/usersStore'
import router from '@/router'

axios.defaults.baseURL = import.meta.env.VITE_API_URL
//axios.defaults.timeout = 2000;
axios.defaults.headers['Content-Type'] = 'application/json; charset=utf-8'
//Filtrelerde aynı key birden fazla parametre array ile eklendiğinde url oluştururken [] ekleyerek oluşturmasını engellemek için serializer eklendi
axios.defaults.paramsSerializer = (params) => {
  const queryParts: string[] = []

  for (const key in params) {
    const value = params[key]
    if (Array.isArray(value)) {
      value.forEach((v) => {
        queryParts.push(`${key}=${encodeURIComponent(v)}`)
      })
    } else if (value !== undefined && value !== null) {
      queryParts.push(`${key}=${encodeURIComponent(value)}`)
    }
  }

  return queryParts.join('&')
}
import { useDataStore } from '@/stores/dataStore'

// İstek Öncesinde Çalışacak Bir Fonksiyon
axios.interceptors.request.use(
  function (config) {
    const dataStore = useDataStore()
    if (!dataStore.isLoading) dataStore.isLoading = true
    // İstek gönderilmeden önce yapılacak işlemler
    //console.log('İstek Yapılıyor:', config)
    const token = sessionStorage.getItem('token')

    if (!token) {
      console.log('No token found')
    } else {
      config.headers['Authorization'] = `Bearer ${token}`
    }

    return config
  },
  function (error) {
    // İstek gönderilmeden önce hata oluşursa burada yakalanır
    return Promise.reject(error)
  }
)
// İstek Sonrası Çalışacak Bir Fonksiyon
axios.interceptors.response.use(
  function (response) {
    const dataStore = useDataStore()
    dataStore.isLoading = false
    // Yanıt başarılı olursa yapılacak işlemler
    //console.log('Yanıt Alındı:', response)
    return response
  },
  function (error) {
    const usersStore = useUsersStore()
    const dataStore = useDataStore()
    dataStore.isLoading = false
    // Yanıtta hata oluşursa burada yakalanır (401 login'e yönlendir, diğerleri dataStore catch'te toast gösterir)
    if (error.response?.status === 401) {
      const token = sessionStorage.getItem(usersStore.userStorageKeys.TOKEN)
      if (token !== undefined) {
        usersStore.ResetUserData()
        router.push('/login')
      }
    }
    return Promise.reject(error)
  }
)

export default axios
