import axios from 'axios'
import { useLoading } from './useLoading'

export const useApi = () => {
  const config = useRuntimeConfig()
  const API_BASE_URL = config.public.apiBase + '/api'  

  const { showLoading, hideLoading } = useLoading()
  let pendingRequests = 0

  // Axios 인스턴스 생성
  const apiClient = axios.create({
    baseURL: API_BASE_URL,
    timeout: 30000,
    headers: {
      'Content-Type': 'application/json'
    }
  })

  // Request Interceptor (토큰 자동 추가 + 로딩 시작)
  apiClient.interceptors.request.use(
    (config) => {
      // 로딩 카운터 증가
      pendingRequests++
      if (pendingRequests === 1) {
        showLoading()
      }

      if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
        const token = localStorage.getItem('admin_token')
        if (token) {
          config.headers.Authorization = `Bearer ${token}`
          console.log('[useApi] Request with token:', config.url, token.substring(0, 20) + '...')
        } else {
          console.log('[useApi] Request without token:', config.url)
        }
      }
      return config
    },
    (error) => {
      // 에러 발생시에도 카운터 감소
      pendingRequests--
      if (pendingRequests === 0) {
        hideLoading()
      }
      return Promise.reject(error)
    }
  )

  // Response Interceptor (에러 처리 + 로딩 종료)
  apiClient.interceptors.response.use(
    (response) => {
      // 로딩 카운터 감소
      pendingRequests--
      if (pendingRequests === 0) {
        hideLoading()
      }

      console.log('[useApi] Response:', response.config.url, response.status)
      return response
    },
    (error) => {
      // 에러 시에도 카운터 감소
      pendingRequests--
      if (pendingRequests === 0) {
        hideLoading()
      }

      const status = error.response?.status
      const url = error.config?.url

      console.log('[useApi] Error:', {
        url,
        status,
        message: error.message,
        hasToken: typeof window !== 'undefined' && typeof localStorage !== 'undefined' ? !!localStorage.getItem('admin_token') : false
      })

      // 401 에러: 어드민/사용자 영역 분기 처리
      if (status === 401) {
        console.log('[useApi] 401 Unauthorized - 토큰 삭제 및 로그아웃')
        if (typeof window !== 'undefined') {
          const currentPath = window.location.pathname
          if (currentPath.startsWith('/site-manager')) {
            // 어드민 영역
            localStorage.removeItem('admin_token')
            localStorage.removeItem('admin_user')
            window.location.href = '/site-manager'
          } else {
            // 일반 사용자 영역
            ;['user_token', 'user_token_expires', 'user', 'auto_login'].forEach((k) => {
              localStorage.removeItem(k)
              sessionStorage.removeItem(k)
            })
            // 이미 로그인 페이지면 그대로 두기 (로그인 시도 자체가 401일 수 있음)
            if (!currentPath.startsWith('/login')) {
              window.location.href = '/login'
            }
          }
        }
      } else {
        console.log('[useApi] 401이 아닌 에러 - 토큰 유지')
      }

      return Promise.reject(error)
    }
  )

  // GET 요청
  const get = async (url, config = {}) => {
    try {
      const response = await apiClient.get(url, config)
      // 전체 응답 반환: { success, data, message }
      return { data: response.data, error: null }
    } catch (error) {
      return { data: null, error: error.response?.data || error.message }
    }
  }

  // POST 요청
  const post = async (url, data = {}) => {
    try {
      const response = await apiClient.post(url, data)
      // 전체 응답 반환: { success, data, message }
      return { data: response.data, error: null }
    } catch (error) {
      return { data: null, error: error.response?.data || error.message }
    }
  }

  // PUT 요청
  const put = async (url, data = {}) => {
    try {
      const response = await apiClient.put(url, data)
      // 전체 응답 반환: { success, data, message }
      return { data: response.data, error: null }
    } catch (error) {
      return { data: null, error: error.response?.data || error.message }
    }
  }

  // PATCH 요청
  const patch = async (url, data = {}) => {
    try {
      const response = await apiClient.patch(url, data)
      // 전체 응답 반환: { success, data, message }
      return { data: response.data, error: null }
    } catch (error) {
      return { data: null, error: error.response?.data || error.message }
    }
  }

  // DELETE 요청
  const del = async (url) => {
    try {
      const response = await apiClient.delete(url)
      // 전체 응답 반환: { success, data, message }
      return { data: response.data, error: null }
    } catch (error) {
      return { data: null, error: error.response?.data || error.message }
    }
  }

  // 파일 업로드
  const upload = async (url, formData) => {
    try {
      const response = await apiClient.post(url, formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      // 전체 응답 반환: { success, data, message }
      return { data: response.data, error: null }
    } catch (error) {
      return { data: null, error: error.response?.data || error.message }
    }
  }

  return {
    get,
    post,
    put,
    patch,
    del,
    upload
  }
}
