/**
 * EN: OAuth utility functions for social authentication
 * VI: Các hàm tiện ích OAuth cho xác thực mạng xã hội
 */

/**
 * EN: Get API base URL from environment
 * VI: Lấy API base URL từ environment
 */
const getApiBaseUrl = (): string => {
  return process.env.NEXT_PUBLIC_API_URL || 'http://localhost/api/v1';
};

/**
 * EN: OAuth provider types
 * VI: Các loại provider OAuth
 */
export type OAuthProvider = 'google' | 'facebook' | 'github';

/**
 * EN: Initiate OAuth flow by redirecting to backend OAuth endpoint
 * VI: Bắt đầu luồng OAuth bằng cách chuyển hướng đến endpoint OAuth của backend
 *
 * @param provider - OAuth provider (google, facebook, github)
 * @param redirectUrl - Optional redirect URL after successful authentication
 */
export const initiateOAuth = (provider: OAuthProvider, redirectUrl?: string): void => {
  // EN: Store redirect URL in sessionStorage for use after callback
  // VI: Lưu redirect URL vào sessionStorage để sử dụng sau callback
  if (redirectUrl && typeof window !== 'undefined') {
    sessionStorage.setItem('oauth_redirect', redirectUrl);
  }

  // EN: Build OAuth initiation URL
  // VI: Xây dựng URL bắt đầu OAuth
  const apiBaseUrl = getApiBaseUrl();
  const oauthUrl = `${apiBaseUrl}/auth/social/${provider}`;

  // EN: Redirect to backend OAuth endpoint
  // VI: Chuyển hướng đến endpoint OAuth của backend
  if (typeof window !== 'undefined') {
    window.location.href = oauthUrl;
  }
};

/**
 * EN: Handle OAuth callback by extracting token from URL
 * VI: Xử lý OAuth callback bằng cách trích xuất token từ URL
 *
 * @param token - Access token from OAuth callback
 * @returns Access token string
 */
export const handleOAuthCallback = (token: string): string => {
  return token;
};

/**
 * EN: Handle OAuth error by extracting error message from URL
 * VI: Xử lý lỗi OAuth bằng cách trích xuất thông báo lỗi từ URL
 *
 * @param errorMessage - Error message from OAuth callback
 * @returns Error message string
 */
export const handleOAuthError = (errorMessage: string): string => {
  return decodeURIComponent(errorMessage);
};

/**
 * EN: Get stored redirect URL from sessionStorage
 * VI: Lấy redirect URL đã lưu từ sessionStorage
 *
 * @returns Redirect URL or null
 */
export const getStoredRedirectUrl = (): string | null => {
  if (typeof window === 'undefined') {
    return null;
  }
  const redirectUrl = sessionStorage.getItem('oauth_redirect');
  if (redirectUrl) {
    sessionStorage.removeItem('oauth_redirect');
  }
  return redirectUrl;
};

/**
 * EN: Google OAuth initiation helper
 * VI: Helper để bắt đầu OAuth Google
 *
 * @param redirectUrl - Optional redirect URL after successful authentication
 */
export const signInWithGoogle = (redirectUrl?: string): void => {
  initiateOAuth('google', redirectUrl);
};

/**
 * EN: Facebook OAuth initiation helper
 * VI: Helper để bắt đầu OAuth Facebook
 *
 * @param redirectUrl - Optional redirect URL after successful authentication
 */
export const signInWithFacebook = (redirectUrl?: string): void => {
  initiateOAuth('facebook', redirectUrl);
};

/**
 * EN: GitHub OAuth initiation helper
 * VI: Helper để bắt đầu OAuth GitHub
 *
 * @param redirectUrl - Optional redirect URL after successful authentication
 */
export const signInWithGitHub = (redirectUrl?: string): void => {
  initiateOAuth('github', redirectUrl);
};
