import {
  GatewayApiError,
  getCurrentUser,
  OIDC_BROWSER_SESSION_CREDENTIAL,
} from '../api';

type CurrentUser = Awaited<ReturnType<typeof getCurrentUser>>;

export interface RestoredOIDCBrowserSession {
  credential: typeof OIDC_BROWSER_SESSION_CREDENTIAL;
  user: CurrentUser;
}

export interface ReconcileOIDCBrowserSessionOptions {
  credential: string;
  oidcEnabled: boolean;
  onReset: () => void;
  onRestored: (session: RestoredOIDCBrowserSession) => void;
}

export async function restoreOIDCBrowserSession(): Promise<RestoredOIDCBrowserSession | null> {
  try {
    const user = await getCurrentUser(OIDC_BROWSER_SESSION_CREDENTIAL);
    return { credential: OIDC_BROWSER_SESSION_CREDENTIAL, user };
  } catch (error) {
    if (error instanceof GatewayApiError && error.details.status === 401) return null;
    throw error;
  }
}

export async function reconcileOIDCBrowserSessionAfterRuntimeChange(
  options: ReconcileOIDCBrowserSessionOptions,
): Promise<'ignored' | 'reset' | 'restored'> {
  if (options.credential !== OIDC_BROWSER_SESSION_CREDENTIAL) return 'ignored';
  if (!options.oidcEnabled) {
    options.onReset();
    return 'reset';
  }
  const restored = await restoreOIDCBrowserSession();
  if (!restored) {
    options.onReset();
    return 'reset';
  }
  options.onRestored(restored);
  return 'restored';
}
