// Hooks
import { FC, useEffect } from 'react';

// Antd
import { Collapse, Form, FormProps } from 'antd';

// Types
import { TypeCardInfoEndpointMessages } from 'pages/DevicesDashboard/types';
import { TypeEventJournalTableMessages } from 'pages/EventsJournalDashboard/types';
import { TypeCommonValidationMessages } from 'components/i18n';
import { FormInstance } from 'antd/lib/form/hooks/useForm';
import { RootStore } from 'stores/RootStore';

// Apps
import { useStore } from 'stores/StoreProvider';
import { EndpointLargeFormItems } from './EndpointLargeFormItems';
import { useEndpointFormConfiguration } from './useEndpointFormConfiguration';

// Styles
import styles from 'pages/IncidentsDashboard/NCIRCCNotificationForm/NCIRCCNotificationForm.module.scss';

// Antd Items
const { Panel } = Collapse;
const { Item } = Form;

export type EndpointFormProps = FormProps & {
  tableTranslations: TypeEventJournalTableMessages;
  locale: TypeCardInfoEndpointMessages;
  localeValidation: TypeCommonValidationMessages;
  form: FormInstance;
};

export const EndpointForm: FC<EndpointFormProps> = ({
  tableTranslations,
  locale,
  localeValidation,
  form,
}) => {
  const rootStore: RootStore = useStore();
  const devicesUiStore = rootStore.devicesUiStore;

  useEffect(() => {
    form.getFieldsValue();
  }, [form]);

  const {
    name,
    ip,
    port,
    integrityControlEnabled,
    integrityControlTimeout,
    prohibitCdAccess,
    rotationSettings,
    antivirusEnabled,
    description,
    whitelistAdmin,
    antivirusRemoveInfectedFiles,
    deviceControlEnabled,
    whitelistEnabled,
    antivirusStartScan,
    group,
    usbControlEnabled,
  } = useEndpointFormConfiguration(locale, localeValidation, form);

  const formItemsProps: {
    key: string;
    type?: string;
    name: string;
    label: string;
    component?: JSX.Element;
    collapsedItems?: {
      key: string;
      name: string;
      valuePropName?: string;
      component: JSX.Element;
    }[];
  }[] = [
    // Имя
    name,

    // IP
    ip,

    // Порт
    port,

    // Коллапс - Директория сканирования при запуске
    {
      key: 'integrity_control_settings',
      type: 'collapsed',
      name: locale.scanDirAtStartUp.title,
      label: locale.scanDirAtStartUp.title,
      collapsedItems: [
        // Включить контроль целостности
        integrityControlEnabled,

        // Период буферизации событий
        integrityControlTimeout,
      ],
    },

    // Коллапс - Белый список приложений
    {
      key: 'whitelist_settings',
      type: 'collapsed',
      name: locale.scanDirAtStartUp.title,
      label: locale.whiteList.title,
      collapsedItems: [
        //  Включить белый список
        whitelistEnabled,
        //  Локальный администратор игнорирует белый список
        whitelistAdmin,
      ],
    },

    // Коллапс - Настройка управления устройствами
    {
      key: 'device_management_settings',
      type: 'collapsed',
      label: locale.deviceManagementSettings.title,
      name: locale.scanDirAtStartUp.title,
      collapsedItems: [
        // Включить контроль устройств
        deviceControlEnabled,

        // Запретить доступ на чтение CD/DVD
        prohibitCdAccess,

        // Включить контроль USB устройств
        usbControlEnabled,
      ],
    },

    // Коллапс - Настройки ротации событий
    {
      key: 'rotation_settings',
      type: 'collapsed',
      label: locale.rotation.title,
      name: 'rotation_settings',
      collapsedItems: [
        //  Настройки ротации
        rotationSettings,
      ],
    },

    // Коллапс - Настройка антивируса
    {
      key: 'antivirus_settings',
      name: 'antivirus_settings',
      type: 'collapsed',
      label: locale.antivirusSettings.title,
      collapsedItems: [
        //  Включить модуль антивируса
        antivirusEnabled,

        //  Удалять инфицированные файлы
        antivirusRemoveInfectedFiles,
      ],
    },

    //  Коллапс - Результаты антивирусного сканирования
    {
      key: 'scan_antivirus_settings',
      name: 'scan_antivirus_settings',
      type: 'collapsed',
      label: locale.antivirusSettings.scanBlockTitle,
      collapsedItems: [
        // Сканирование на вирусы
        antivirusStartScan,
      ],
    },

    // Группы
    group,

    // Описание
    description,
  ];

  return devicesUiStore.cardSize === 'small' ? (
    <>
      {formItemsProps.map(({ collapsedItems, ...items }) => {
        return collapsedItems ? (
          <Collapse
            key={items.key}
            ghost
            className={styles['custom-collapse-panel']}
            defaultActiveKey={
              devicesUiStore.isCopyEndpointStatus ? items.key : ''
            }
          >
            <Panel
              header={
                <span className={styles['custom-collapse-panel-label']}>
                  {items.label}
                </span>
              }
              key={items.key}
            >
              {collapsedItems.map(({ component, ...elems }) => (
                <Item
                  shouldUpdate
                  className={styles['custom-form_tem']}
                  style={{ whiteSpace: 'normal' }}
                  {...elems}
                >
                  {component}
                </Item>
              ))}
            </Panel>
          </Collapse>
        ) : (
          <Item {...items} shouldUpdate>
            {items.component}
          </Item>
        );
      })}
    </>
  ) : (
    <EndpointLargeFormItems
      form={form}
      tableTranslations={tableTranslations}
      locale={locale}
      localeValidation={localeValidation}
    />
  );
};
