
import { getSupabaseKey } from './config';
import { modifyStorageApiRequest } from './storageUtils';

/**
 * Supabase 클라이언트에서 사용할 커스텀 fetch 구현
 */
export const customFetch = (...args: [RequestInfo | URL, RequestInit?]): Promise<Response> => {
  // 첫 번째 인자는 URL 또는 Request 객체
  let requestToUse = args[0];
  let url = '';
  
  // URL 형식 변환
  if (typeof requestToUse === 'string') {
    url = requestToUse;
  } else if (requestToUse instanceof Request) {
    url = requestToUse.url;
  }
  
  // Storage API 호출 감지 및 요청 수정
  if (url.includes('/storage/v1/')) {
    requestToUse = modifyStorageApiRequest(requestToUse, args[1], getSupabaseKey());
    
    // args[1]이 존재하는 경우 modifyStorageApiHeaders 함수를 통해 헤더 수정
    if (args[1]) {
      args[1] = modifyStorageApiHeaders(args[1], getSupabaseKey());
    }
  }
  
  // URL 로깅 및 디버깅
  console.log('Supabase fetch 요청:', url);
  
  // 기본 fetch 호출
  return fetch(requestToUse, args[1])
    .then(response => {
      console.log('Supabase 응답 상태:', response.status);
      return response;
    })
    .catch(err => {
      console.error('Supabase fetch 오류:', err);
      throw err;
    });
};

/**
 * Storage API 요청에 대한 헤더 수정
 */
function modifyStorageApiHeaders(options: RequestInit, supabaseAnonKey: string): RequestInit {
  if (!options.headers) {
    return options;
  }
  
  console.log('Storage API 호출 감지');
  
  // 헤더 수정
  const originalHeaders = options.headers;
  const newHeaders = new Headers(originalHeaders);
  
  // apikey 헤더가 있으면 삭제하고 Authorization 헤더로 교체
  if (newHeaders.has('apikey')) {
    const apiKeyValue = newHeaders.get('apikey');
    newHeaders.delete('apikey');
    newHeaders.set('Authorization', `Bearer ${apiKeyValue}`);
  } else if (newHeaders.has('Apikey')) {
    const apiKeyValue = newHeaders.get('Apikey');
    newHeaders.delete('Apikey');
    newHeaders.set('Authorization', `Bearer ${apiKeyValue}`);
  } else {
    // apikey 헤더가 없지만 Storage API를 호출하는 경우
    newHeaders.set('Authorization', `Bearer ${supabaseAnonKey}`);
  }
  
  // 수정된 헤더로 새 옵션 객체 생성
  const newOptions = { ...options, headers: newHeaders };
  console.log('Storage API 헤더 형식 수정 완료');
  
  return newOptions;
}
