import type { ConfigPropertyRepresentation } from "@keycloak/keycloak-admin-client/lib/defs/authenticatorConfigInfoRepresentation";
import { FunctionComponent } from "react";

import { BooleanComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/BooleanComponent";
import { ClientSelectComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/ClientSelectComponent";
import { FileComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/FileComponent";
import { GroupComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/GroupComponent";
import { ListComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/ListComponent";
import { MapComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/MapComponent";
import { MultiValuedListComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/MultivaluedListComponent";
import { MultiValuedStringComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/MultivaluedStringComponent";
import { PasswordComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/PasswordComponent";
import { RoleComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/RoleComponent";
import { ScriptComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/ScriptComponent";
import { StringComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/StringComponent";
import { TextComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/TextComponent";
import { UrlComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/UrlComponent";
import { UserProfileAttributeListComponent } from "@keycloakify/keycloak-admin-ui/components/dynamic/UserProfileAttributeListComponent";

export type ComponentProps = Omit<ConfigPropertyRepresentation, "type"> & {
  isDisabled?: boolean;
  isNew?: boolean;
  stringify?: boolean;
};

type ComponentType =
  | "String"
  | "Text"
  | "boolean"
  | "List"
  | "Role"
  | "Script"
  | "Map"
  | "Group"
  | "MultivaluedList"
  | "ClientList"
  | "UserProfileAttributeList"
  | "MultivaluedString"
  | "File"
  | "Password"
  | "Url";

export const COMPONENTS: {
  [index in ComponentType]: FunctionComponent<ComponentProps>;
} = {
  String: StringComponent,
  Text: TextComponent,
  boolean: BooleanComponent,
  List: ListComponent,
  Role: RoleComponent,
  Script: ScriptComponent,
  Map: MapComponent,
  Group: GroupComponent,
  ClientList: ClientSelectComponent,
  UserProfileAttributeList: UserProfileAttributeListComponent,
  MultivaluedList: MultiValuedListComponent,
  MultivaluedString: MultiValuedStringComponent,
  File: FileComponent,
  Password: PasswordComponent,
  Url: UrlComponent,
} as const;

export const isValidComponentType = (value: string): value is ComponentType =>
  value in COMPONENTS;
