import { AuthErrorRedirect } from "../error";
import {
  OAuth2Authorization,
  OAuth2Callback,
  OIDCAuthorization,
  OIDCCallback,
} from "../resources";
import type { Endpoint } from "../types";

export async function handleGetRequests(
  request: Request,
  options: Endpoint,
): Promise<Response> {
  const request_url = new URL(request.url);

  const resource = request_url.pathname.split("/")[3];
  const providerId = request_url.pathname.split("/")[4];

  const provider = options.providers[providerId];
  const sessionCallback = options.sessionCallback;

  if (!provider) {
    return AuthErrorRedirect(request, "Invalid resource or provider");
  }
  switch (resource) {
    case "authorization":
      switch (provider.protocol) {
        case "OIDC":
          return OIDCAuthorization(request, provider);
        case "OAuth2":
          return OAuth2Authorization(request, provider);
        default:
          return AuthErrorRedirect(request, "Invaild provider requested");
      }
    case "callback":
      switch (provider.protocol) {
        case "OIDC":
          return OIDCCallback(request, provider, sessionCallback);
        case "OAuth2":
          return OAuth2Callback(request, provider, sessionCallback);

        default:
          return AuthErrorRedirect(request, "Invaild provider requested");
      }
    default:
      return AuthErrorRedirect(request, "Invalid resource request");
  }
}
