/**
 * API 에러 타입 정의
 *
 * 전역 에러 핸들링을 위한 커스텀 에러 클래스들
 */

/**
 * 인증 에러 (401 Unauthorized)
 * - 토큰 만료
 * - 세션 만료
 * - 인증 실패
 */
export class AuthError extends Error {
  public readonly status = 401;
  public readonly code = 'AUTH_ERROR';

  constructor(message: string = '인증이 만료되었습니다. 다시 로그인해주세요.') {
    super(message);
    this.name = 'AuthError';
  }
}

/**
 * API 에러 응답 타입
 * Server Action에서 클라이언트로 전달되는 에러 형식
 */
export interface ApiErrorResponse {
  __error: true;
  __authError?: boolean;
  status: number;
  message: string;
  code?: string;
}

/**
 * 인증 에러 응답 생성 헬퍼
 * Server Action에서 401 발생 시 반환할 객체
 */
export function createAuthErrorResponse(message?: string): ApiErrorResponse {
  return {
    __error: true,
    __authError: true,
    status: 401,
    message: message || '인증이 만료되었습니다. 다시 로그인해주세요.',
    code: 'AUTH_ERROR',
  };
}

/**
 * 일반 API 에러 응답 생성 헬퍼
 * - 디버깅을 위해 상태 코드를 메시지에 포함
 */
export function createErrorResponse(status: number, message: string, code?: string): ApiErrorResponse {
  return {
    __error: true,
    __authError: status === 401,
    status,
    message: `[${status}] ${message}`,
    code,
  };
}

/**
 * 응답이 에러인지 확인하는 타입 가드
 */
export function isApiError(response: unknown): response is ApiErrorResponse {
  return (
    typeof response === 'object' &&
    response !== null &&
    '__error' in response &&
    (response as ApiErrorResponse).__error === true
  );
}

/**
 * 응답이 인증 에러인지 확인하는 타입 가드
 */
export function isAuthError(response: unknown): response is ApiErrorResponse {
  return isApiError(response) && response.__authError === true;
}