import type ComponentRepresentation from "@keycloak/keycloak-admin-client/lib/defs/componentRepresentation";
import { Button, Form } from "@patternfly/react-core";
import { useFormContext } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom";
import { ScrollForm } from "@keycloakify/keycloak-admin-ui/ui-shared";

import { FixedButtonsGroup } from "@keycloakify/keycloak-admin-ui/components/form/FixedButtonGroup";
import { useRealm } from "@keycloakify/keycloak-admin-ui/context/realm-context/RealmContext";
import useIsFeatureEnabled, { Feature } from "@keycloakify/keycloak-admin-ui/utils/useIsFeatureEnabled";
import { LdapSettingsAdvanced } from "@keycloakify/keycloak-admin-ui/user-federation/ldap/LdapSettingsAdvanced";
import { LdapSettingsConnection } from "@keycloakify/keycloak-admin-ui/user-federation/ldap/LdapSettingsConnection";
import { LdapSettingsGeneral } from "@keycloakify/keycloak-admin-ui/user-federation/ldap/LdapSettingsGeneral";
import { LdapSettingsKerberosIntegration } from "@keycloakify/keycloak-admin-ui/user-federation/ldap/LdapSettingsKerberosIntegration";
import { LdapSettingsSearching } from "@keycloakify/keycloak-admin-ui/user-federation/ldap/LdapSettingsSearching";
import { LdapSettingsSynchronization } from "@keycloakify/keycloak-admin-ui/user-federation/ldap/LdapSettingsSynchronization";
import { toUserFederation } from "@keycloakify/keycloak-admin-ui/user-federation/routes/UserFederation";
import { SettingsCache } from "@keycloakify/keycloak-admin-ui/user-federation/shared/SettingsCache";

export type LdapComponentRepresentation = ComponentRepresentation & {
  config?: {
    periodicChangedUsersSync?: boolean;
    periodicFullSync?: boolean;
  };
};

export type UserFederationLdapFormProps = {
  id?: string;
  onSubmit: (formData: LdapComponentRepresentation) => void;
};

export const UserFederationLdapForm = ({
  id,
  onSubmit,
}: UserFederationLdapFormProps) => {
  const { t } = useTranslation();
  const form = useFormContext<LdapComponentRepresentation>();
  const navigate = useNavigate();
  const { realm } = useRealm();
  const isFeatureEnabled = useIsFeatureEnabled();

  return (
    <>
      <ScrollForm
        label={t("jumpToSection")}
        sections={[
          {
            title: t("generalOptions"),
            panel: <LdapSettingsGeneral form={form} vendorEdit={!!id} />,
          },
          {
            title: t("connectionAndAuthenticationSettings"),
            panel: <LdapSettingsConnection form={form} id={id} />,
          },
          {
            title: t("ldapSearchingAndUpdatingSettings"),
            panel: <LdapSettingsSearching form={form} />,
          },
          {
            title: t("synchronizationSettings"),
            panel: <LdapSettingsSynchronization form={form} />,
          },
          {
            title: t("kerberosIntegration"),
            panel: <LdapSettingsKerberosIntegration form={form} />,
            isHidden: !isFeatureEnabled(Feature.Kerberos),
          },
          { title: t("cacheSettings"), panel: <SettingsCache form={form} /> },
          {
            title: t("advancedSettings"),
            panel: <LdapSettingsAdvanced form={form} id={id} />,
          },
        ]}
      />
      <Form onSubmit={form.handleSubmit(onSubmit)}>
        <FixedButtonsGroup
          name="ldap"
          isDisabled={!form.formState.isDirty}
          isSubmit
        >
          <Button
            variant="link"
            onClick={() => navigate(toUserFederation({ realm }))}
            data-testid="ldap-cancel"
          >
            {t("cancel")}
          </Button>
        </FixedButtonsGroup>
      </Form>
    </>
  );
};

export function serializeFormData(
  formData: LdapComponentRepresentation,
): LdapComponentRepresentation {
  const { config } = formData;

  if (config?.periodicChangedUsersSync !== undefined) {
    if (config.periodicChangedUsersSync === false) {
      config.changedSyncPeriod = ["-1"];
    }
    delete config.periodicChangedUsersSync;
  }

  if (config?.periodicFullSync !== undefined) {
    if (config.periodicFullSync === false) {
      config.fullSyncPeriod = ["-1"];
    }
    delete config.periodicFullSync;
  }

  return formData;
}
