import axios from 'axios'

// 공통 axios 인스턴스
const http = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  },
})

// 요청 인터셉터 (예: 토큰 주입)
http.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => Promise.reject(error),
)

// 응답 인터셉터 (공통 에러 처리)
http.interceptors.response.use(
  (response) => response.data,
  (error) => {
    const status = error.response?.status
    if (status === 401) {
      // 세션 만료/무효: 클라이언트 저장값 정리 후 로그인 팝업 트리거
      localStorage.removeItem('token')
      localStorage.removeItem('auth_user')
      window.dispatchEvent(new CustomEvent('auth:unauthorized'))
    } else if (status === 403 && error.response?.data?.code === 'PREMIUM_REQUIRED') {
      // 유료 전용 API 를 무료 회원이 호출(우회/직접 접근) — 업그레이드 안내
      window.dispatchEvent(new CustomEvent('premium:required'))
    } else if (!error.response && error.code !== 'ERR_CANCELED' && !error.config?.suppressNetError) {
      // 응답 자체가 없음 = 네트워크 오류(오프라인/타임아웃/서버 연결 불가). 취소 요청은 제외.
      // suppressNetError: 자체 폴백/에러표시가 있는 호출(예: 영수증 AI)은 전역 배너를 띄우지 않음.
      window.dispatchEvent(new CustomEvent('net:error'))
    }
    return Promise.reject(error)
  },
)

export default http
