
import { parseResponse, showAuthToast } from '@/utils/auth';
import { getProxyType, isCorsProxyEnabled, getSupabaseUrl, getOriginalSupabaseUrl } from '@/lib/supabase/config';
import { handleNetworkError } from '@/utils/auth/handleNetworkError';

/**
 * 직접 API 호출을 통한 회원가입 요청 전송
 */
export const sendSignUpApiRequest = async (
  email: string, 
  password: string, 
  username: string, 
  redirectUrl: string,
  supabaseKey: string
) => {
  try {
    // 프록시 적용된 URL과 원본 URL 모두 가져오기
    const supabaseUrl = getOriginalSupabaseUrl(); // 원본 URL
    const proxyUrl = getSupabaseUrl(); // 프록시 적용된 URL
    
    // 프록시 정보 로깅
    const usingProxy = isCorsProxyEnabled();
    const proxyType = getProxyType();
    console.log(`CORS 프록시 사용: ${usingProxy ? '예' : '아니오'}, 타입: ${proxyType}, 프록시 URL: ${proxyUrl}`);
    
    // 실제 요청에 사용할 URL 결정 (항상 프록시 URL 사용)
    const useUrl = usingProxy ? proxyUrl : supabaseUrl;
    
    // URL에 auth/v1이 이미 포함되어있는지 확인
    const baseUrl = useUrl.includes('/auth/v1') ? useUrl : `${useUrl}/auth/v1`;
    
    // 회원가입 API 엔드포인트 및 헤더 설정
    const signUpUrl = `${baseUrl}/signup`;
    const headers = {
      'Content-Type': 'application/json',
      'apikey': supabaseKey
    };
    
    console.log('회원가입 API 요청 URL:', signUpUrl);
    
    // 회원가입 요청 전송
    const response = await fetch(signUpUrl, {
      method: 'POST',
      headers,
      body: JSON.stringify({ 
        email, 
        password,
        data: { username }, // 사용자 메타데이터에 username 추가
        redirect_to: redirectUrl // 리디렉션 URL 추가
      }),
      signal: AbortSignal.timeout(15000) // 타임아웃 시간 증가
    });
    
    console.log('회원가입 응답 상태:', response.status);
    return response;
  } catch (error) {
    throw error; // 상위 함수에서 처리하도록 오류 전파
  }
};

/**
 * 응답 상태 코드 기반 에러 메시지 생성
 */
export const getStatusErrorMessage = (status: number): string => {
  switch (status) {
    case 400:
      return '잘못된 요청 형식입니다. 입력 데이터를 확인하세요.';
    case 401:
      return '회원가입 권한이 없습니다. Supabase 설정 또는 권한을 확인하세요.';
    case 404:
      return '서버 경로를 찾을 수 없습니다. Supabase URL을 확인하세요.';
    case 500:
      return '서버 내부 오류가 발생했습니다. 나중에 다시 시도하세요.';
    default:
      return `회원가입 처리 중 오류가 발생했습니다 (${status}). 나중에 다시 시도하세요.`;
  }
};
