import type { AccessType } from "@keycloak/keycloak-admin-client/lib/defs/whoAmIRepresentation";
import type { TFunction } from "i18next";
import type { ComponentType } from "react";
import type { NonIndexRouteObject, RouteObject } from "react-router-dom";
import { PageNotFoundSection } from "@keycloakify/keycloak-admin-ui/PageNotFoundSection";
import { Root } from "@keycloakify/keycloak-admin-ui/Root";
import authenticationRoutes from "@keycloakify/keycloak-admin-ui/authentication/routes";
import clientScopesRoutes from "@keycloakify/keycloak-admin-ui/client-scopes/routes";
import clientRoutes from "@keycloakify/keycloak-admin-ui/clients/routes";
import dashboardRoutes from "@keycloakify/keycloak-admin-ui/dashboard/routes";
import eventRoutes from "@keycloakify/keycloak-admin-ui/events/routes";
import groupsRoutes from "@keycloakify/keycloak-admin-ui/groups/routes";
import identityProviders from "@keycloakify/keycloak-admin-ui/identity-providers/routes";
import organizationRoutes from "@keycloakify/keycloak-admin-ui/organizations/routes";
import pageRoutes from "@keycloakify/keycloak-admin-ui/page/routes";
import realmRoleRoutes from "@keycloakify/keycloak-admin-ui/realm-roles/routes";
import realmSettingRoutes from "@keycloakify/keycloak-admin-ui/realm-settings/routes";
import realmRoutes from "@keycloakify/keycloak-admin-ui/realm/routes";
import sessionRoutes from "@keycloakify/keycloak-admin-ui/sessions/routes";
import userFederationRoutes from "@keycloakify/keycloak-admin-ui/user-federation/routes";
import userRoutes from "@keycloakify/keycloak-admin-ui/user/routes";

export type AppRouteObjectHandle = {
  access: AccessType | AccessType[];
};

export interface AppRouteObject extends NonIndexRouteObject {
  path: string;
  breadcrumb?: (t: TFunction) => string | ComponentType<any>;
  handle: AppRouteObjectHandle;
}

export const NotFoundRoute: AppRouteObject = {
  path: "*",
  element: <PageNotFoundSection />,
  handle: {
    access: "anyone",
  },
};

export const routes: AppRouteObject[] = [
  ...authenticationRoutes,
  ...clientRoutes,
  ...clientScopesRoutes,
  ...eventRoutes,
  ...identityProviders,
  ...organizationRoutes,
  ...realmRoleRoutes,
  ...realmRoutes,
  ...realmSettingRoutes,
  ...sessionRoutes,
  ...userFederationRoutes,
  ...userRoutes,
  ...groupsRoutes,
  ...dashboardRoutes,
  ...pageRoutes,
  NotFoundRoute,
];

export const RootRoute: RouteObject = {
  path: "/",
  element: <Root />,
  children: routes,
};
