import apiClient from '../api-client'; // authApi 정의 (auth.api.ts)
import {
  SignupDto,
  LoginDto,
  AuthResponseDto,
  UserProfileDto,
} from '@/types/auth.types';

/**
 * @description 인증 관련 API
 * @see ../api-client.ts : apiClient 인스턴스 참조
 * @see ../api/index.ts : 통합 Export
 * 각 함수는 백엔드의 인증 관련 엔드포인트와 통신
 * 인터셉터가 요청/응답을 자동으로 처리
 *  
 *  
 */
export const authApi = {
  /**
   * 로그인 인증
   */
  login: async (dto: LoginDto): Promise<AuthResponseDto> => {
    // 인터셉터가 자동으로 언래핑
    return await apiClient.post('/auth/login', dto);
  },

  /**
   * 회원가입
   */
  signup: async (dto: SignupDto): Promise<AuthResponseDto> => {
    // 인터셉터가 자동으로 언래핑
    return await apiClient.post('/auth/register', dto);
  },

  /**
   * 회원가입 이메일 인증번호 발송
   */
  sendSignupCode: async (userEmail: string): Promise<{ success: boolean; message: string; expiresIn: number }> => {
    // 인터셉터가 자동으로 언래핑
    return await apiClient.post('/auth/signup/send-code', { userEmail });
  },

  /**
   * 회원가입 이메일 인증번호 확인
   */
  verifySignupCode: async (userEmail: string, code: string): Promise<{ success: boolean; message: string; verified: boolean }> => {
    // 인터셉터가 자동으로 언래핑
    return await apiClient.post('/auth/signup/verify-code', { userEmail, code });
  },


  /**
   * 로그아웃
   */
  logout: async (): Promise<void> => {
    // 백엔드에 로그아웃 엔드포인트가 없으면 클라이언트에서만 처리
    // await apiClient.post('/auth/logout');
  },

  /**
   * 내 프로필 조회 : 미구현
   */
  getProfile: async (): Promise<UserProfileDto> => {
    // 인터셉터가 자동으로 언래핑
    return await apiClient.get('/users/profile');
  },


  /**
   * 비밀번호 변경
   */
  changePassword: async (oldPassword: string, newPassword: string): Promise<void> => {
    await apiClient.post('/auth/reset-password', { oldPassword, newPassword });
  },

  /**
   * 이메일 중복 체크
   */
  checkEmail: async (email: string): Promise<{ available: boolean; message: string }> => {
    // 인터셉터가 자동으로 언래핑
    return await apiClient.get('/auth/check-email', { params: { email } });
  },

  /**
   * 아이디 찾기 - 인증번호 발송
   */
  sendFindIdCode: async (userName: string, userEmail: string): Promise<{ success: boolean; message: string; expiresIn: number }> => {
    return await apiClient.post('/auth/find-id/send-code', { userName, userEmail });
  },

  /**
   * 아이디 찾기 - 인증번호 검증
   */
  verifyFindIdCode: async (userEmail: string, verificationCode: string): Promise<{ success: boolean; message: string; userId: string; maskedUserId: string }> => {
    return await apiClient.post('/auth/find-id/verify-code', { userEmail, verificationCode });
  },

  /**
   * 비밀번호 찾기 - 인증번호 발송
   */
  sendResetPasswordCode: async (userId: string, userEmail: string): Promise<{ success: boolean; message: string; expiresIn: number }> => {
    return await apiClient.post('/auth/reset-password/send-code', { userId, userEmail });
  },

  /**
   * 비밀번호 찾기 - 인증번호 검증
   */
  verifyResetPasswordCode: async (userId: string, userEmail: string, verificationCode: string): Promise<{ success: boolean; message: string; resetToken: string }> => {
    return await apiClient.post('/auth/reset-password/verify-code', { userId, userEmail, verificationCode });
  },

  /**
   * 비밀번호 재설정
   */
  resetPassword: async (resetToken: string, newPassword: string): Promise<{ success: boolean; message: string }> => {
    return await apiClient.post('/auth/reset-password', { resetToken, newPassword });
  },
};
