/**
 * OAuth Error Handler
 * Provides user-friendly error messages for OAuth failures
 */

export const oauthErrors = {
  MISSING_CLIENT_ID: {
    userMessage: "Social login is temporarily unavailable. Please use email/password signup instead.",
    logMessage: "OAuth client ID not configured",
    statusCode: 503,
  },
  INVALID_STATE: {
    userMessage: "Login session expired. Please try again.",
    logMessage: "Invalid OAuth state parameter",
    statusCode: 400,
  },
  MISSING_CODE: {
    userMessage: "Login was cancelled. Please try again.",
    logMessage: "Missing authorization code from OAuth provider",
    statusCode: 400,
  },
  NETWORK_ERROR: {
    userMessage: "Connection error. Please check your internet and try again.",
    logMessage: "Network error during OAuth callback",
    statusCode: 503,
  },
  PROVIDER_ERROR: {
    userMessage: "The OAuth provider returned an error. Please try again or use email signup.",
    logMessage: "OAuth provider returned error",
    statusCode: 400,
  },
  USER_CREATION_FAILED: {
    userMessage: "Failed to create account. Please try again or contact support.",
    logMessage: "Failed to create user after OAuth authentication",
    statusCode: 500,
  },
  SESSION_CREATION_FAILED: {
    userMessage: "Failed to create session. Please try again.",
    logMessage: "Failed to create session token",
    statusCode: 500,
  },
};

export const getOAuthErrorResponse = (errorType: keyof typeof oauthErrors, details?: string) => {
  const error = oauthErrors[errorType];
  return {
    userMessage: error.userMessage,
    logMessage: `${error.logMessage}${details ? `: ${details}` : ""}`,
    statusCode: error.statusCode,
    errorType,
  };
};

export const validateOAuthClientIds = () => {
  const missingIds: string[] = [];
  
  if (!process.env.GOOGLE_OAUTH_CLIENT_ID) {
    missingIds.push("GOOGLE_OAUTH_CLIENT_ID");
  }
  if (!process.env.GITHUB_OAUTH_CLIENT_ID) {
    missingIds.push("GITHUB_OAUTH_CLIENT_ID");
  }
  if (!process.env.APPLE_OAUTH_CLIENT_ID) {
    missingIds.push("APPLE_OAUTH_CLIENT_ID");
  }
  
  if (missingIds.length > 0) {
    console.warn(
      `[OAuth] Missing OAuth client IDs: ${missingIds.join(", ")}. ` +
      "Social login will not work. Add these to Settings → Secrets."
    );
    return false;
  }
  
  return true;
};

export const handleOAuthError = (res: any, errorType: keyof typeof oauthErrors, details?: string, redirectUri?: string) => {
  const error = getOAuthErrorResponse(errorType, details);
  console.error(`[OAuth] ${error.logMessage}`);
  
  if (redirectUri) {
    // Redirect to login page with error message
    const errorUrl = new URL(redirectUri);
    errorUrl.searchParams.set("error", errorType);
    errorUrl.searchParams.set("message", error.userMessage);
    res.redirect(errorUrl.toString());
  } else {
    // Return JSON error response
    res.status(error.statusCode).json({
      error: errorType,
      message: error.userMessage,
      details: process.env.NODE_ENV === "development" ? error.logMessage : undefined,
    });
  }
};
