import type { AuthorizationServer } from "oauth4webapi";
import type { UserinfoResponse } from "openid-client";

export interface AccountInfo {
  sub: string;
  name: string;
  picture: string;
  email: string;
}
interface BaseOptions {
  id: string;
  name: string;
  scope: string;
  profileCallback: (
    profile:
      | Record<string, string | number | boolean | object>
      | UserinfoResponse,
  ) => AccountInfo;
}
export interface ProviderOptions {
  client_id: string;
  client_secret: string;
  /*
   * Additional parameters you would like to add to query for the provider
   */
  params?: Record<string, string>;
}
export interface OIDCProvider extends BaseOptions, ProviderOptions {
  issuer: URL;
  protocol: "OIDC";
}
export interface OAuth2Provider extends BaseOptions, ProviderOptions {
  authorization_server: AuthorizationServer;
  protocol: "OAuth2";
}
export type OAuthProvider = OAuth2Provider | OIDCProvider;

export type SessionCallback = (profile: {
  email: string;
  provider: string;
  sub: string;
  scope: string;
}) => Promise<Response>;

export interface OAuthAdapterOptions<T = OAuthProvider> {
  providers: T[];
  sessionCallback: SessionCallback;
}

export interface OAuthAdapterConfig {
  handlers: {
    GET: (req: Request) => Promise<Response>;
  };
}

export interface Endpoint<T = OAuth2Provider | OIDCProvider> {
  providers: Record<string, T>;
  sessionCallback: SessionCallback;
}
