/**
 * orval이 생성하는 API 클라이언트의 HTTP 어댑터.
 *
 * - `kyInstance`: 공통 타임아웃·리트라이·훅(인증 토큰 주입, 401 처리 등 추후 추가) 설정
 * - `customFetcher`: orval `httpClient: 'fetch'` 모드의 custom mutator.
 *   생성된 코드가 `customFetcher(url, init)`로 호출하면 ky로 요청을 보내고,
 *   생성 타입이 기대하는 `{ status, data, headers }` 형태로 응답을 정규화함.
 */
import ky, { type KyInstance } from 'ky'

// Vite 가 빌드 시 치환하는 환경변수 (개발 서버에서도 동일).
// import.meta 를 모듈 최상단에서 읽으면 일부 번들러가 cjs 변환 시 경고를 내므로
// 함수 내부에서 lazy 하게 접근.
function getApiKey(): string | undefined {
  try {
    return (import.meta as { env?: { VITE_API_KEY?: string } }).env?.VITE_API_KEY;
  } catch {
    return undefined;
  }
}

export const kyInstance: KyInstance = ky.create({
  timeout: 10_000,
  retry: 1,
  // orval generated 타입이 4xx/5xx 응답도 data로 받아오므로 throw 비활성
  throwHttpErrors: false,
  hooks: {
    beforeRequest: [
      (request) => {
        const apiKey = getApiKey();
        if (apiKey) request.headers.set('x-api-key', apiKey);
      },
      // TODO: 인증 토큰 주입
      // request => {
      //   const token = localStorage.getItem('token')
      //   if (token) request.headers.set('Authorization', `Bearer ${token}`)
      // },
    ],
    afterResponse: [
      // TODO: 401 처리, 토큰 갱신 등
    ],
  },
})

export const customFetcher = async <T>(
  url: string,
  init?: RequestInit,
): Promise<T> => {
  const response = await kyInstance(url, init as Parameters<KyInstance>[1])
  let data: unknown = null
  try {
    data = await response.json()
  } catch {
    // 빈 응답이거나 JSON 파싱 실패
  }
  return { status: response.status, data, headers: response.headers } as T
}

export default customFetcher
