// Libs
// -----------------------------------------------------------------------------
import React, { FC } from 'react';
import { Modal, Typography, Descriptions, Tabs } from 'antd';
import { useTranslation } from 'react-i18next';

// Props
// -----------------------------------------------------------------------------
type CorrelationRulesCheckerHelpDialogProps = {
  isVisible: boolean;
  onClose: () => void;
};

const { Title, Paragraph } = Typography;

export const CorrelationRulesCheckerHelpDialog: FC<
  CorrelationRulesCheckerHelpDialogProps
> = ({ isVisible, onClose }) => {
  const { i18n } = useTranslation();

  return i18n.language === 'ru' ? (
    <Modal
      title="Помощь по коррелятору"
      visible={isVisible}
      onCancel={onClose}
      footer={null}
      width={'50%'}
    >
      <Tabs>
        <Tabs.TabPane tab="Синтаксис" key="1">
          <Paragraph>
            Строка запроса разбивается на ряд терминов и операторов. Термин
            может состоять из одного слова - quick или brown - или фраза,
            заключенная в двойные кавычки - "quick brown" - поиск всех слов в
            заданном порядке.
          </Paragraph>

          <Title>Имена полей</Title>

          <Paragraph>
            Вы можете указать поля для поиска в синтаксисе запроса:
            <pre>
              status: active # поле статуса содержит активные
              <br />
              title:(quick OR brown) # поле заголовка содержит быстрое или
              коричневое
              <br />
              author: "John Smith" # поле author содержит точную фразу "john
              smith"
            </pre>
          </Paragraph>

          <Title>Диапазоны</Title>

          <Paragraph>
            Можно указать диапазоны для полей даты, числовых или строковых
            полей. Включаемые в диапазоны значения указываются в квадратных
            скобках [min TO max], не включаемые в фигурных скобках {'{'}min TO
            max{'}'}.
          </Paragraph>

          <Paragraph>
            Примеры:
            <pre>
              count: [1 TO 5] # Числа 1..5
              <br />
              date: {'{'}* TO 2012-01-01{'}'} # Даты до 2012 г.
              <br />
              count: [от 1 до 5{'}'} # чисел от 1 до 5, но не включая 5
              <br />
              age:{'>'}10
              <br />
              age:{'>='}10
              <br />
              age:{'<'}10
              <br />
              age:{'<='}10
            </pre>
          </Paragraph>

          <Title>Логические операторы</Title>

          <Paragraph>
            Предпочтительные операторы: + (это слово должно присутствовать) и -
            (это слово должно отсутствовать). Все остальные условия
            необязательны. Например, такой запрос:
            <pre>quick brown + fox -news</pre>
            будет искать:
            <pre>
              слово fox должно присутствовать слово
              <br />
              news должно отсутствовать
              <br />
              слова quick и brown необязательны - их присутствие увеличивает
              релевантность.
            </pre>
          </Paragraph>

          <Paragraph>
            Знакомые логические операторы AND, OR и NOT (также записываются как
            &&, || и !) также поддерживаются, но имейте в виду, что они не
            соблюдают обычные правила приоритета, поэтому следует использовать
            круглые скобки если несколько операторов используются вместе.
            Например, предыдущий запрос можно переписать как:
            <pre>((quick AND fox) OR (brown AND fox) OR fox) AND NOT news</pre>
          </Paragraph>
        </Tabs.TabPane>
        <Tabs.TabPane tab="Поля" key="2">
          <Descriptions size="small" bordered column={1}>
            <Descriptions.Item label="event_first">
              Дата и время первого события в правиле
            </Descriptions.Item>
            <Descriptions.Item label="event_last">
              Дата и время последнего события в правиле
            </Descriptions.Item>
            <Descriptions.Item label="event_count">
              Количество событий в правиле
            </Descriptions.Item>
            <Descriptions.Item label="event_timestamp">
              Дата и время, когда правило вызвало срабатывание действия
            </Descriptions.Item>
            <Descriptions.Item label="event_severity">
              Критичность события в промежутке от 0 до 100
            </Descriptions.Item>
            <Descriptions.Item label="event_src_msg">
              Исходное сообщение события
            </Descriptions.Item>
            <Descriptions.Item label="event_protocol">
              Протокол события
            </Descriptions.Item>
            <Descriptions.Item label="device_vendor">
              Производитель устройства
            </Descriptions.Item>
            <Descriptions.Item label="device_product">
              Модуль устройства
            </Descriptions.Item>
            <Descriptions.Item label="device_version">
              Версия устройства
            </Descriptions.Item>
            <Descriptions.Item label="device_action">
              Действие устройства
            </Descriptions.Item>
            <Descriptions.Item label="sign_id">ID сигнатуры</Descriptions.Item>
            <Descriptions.Item label="sign_category">
              Категория сигнатуры
            </Descriptions.Item>
            <Descriptions.Item label="sign_subcategory">
              Подкатегория сигнатуры
            </Descriptions.Item>
            <Descriptions.Item label="sign_name">
              Имя сигнатуры
            </Descriptions.Item>
            <Descriptions.Item label="source_ip">
              IP источника
            </Descriptions.Item>
            <Descriptions.Item label="source_mac">
              MAC источника
            </Descriptions.Item>
            <Descriptions.Item label="source_host">
              Исходный хост
            </Descriptions.Item>
            <Descriptions.Item label="source_port">
              Порт источника
            </Descriptions.Item>
            <Descriptions.Item label="source_user">
              Исходный пользователь
            </Descriptions.Item>
            <Descriptions.Item label="destination_ip">
              IP получателя
            </Descriptions.Item>
            <Descriptions.Item label="destination_host">
              Целевой хост
            </Descriptions.Item>
            <Descriptions.Item label="destination_port">
              Порт получателя
            </Descriptions.Item>
            <Descriptions.Item label="destination_user">
              Целевой пользователь
            </Descriptions.Item>
          </Descriptions>
        </Tabs.TabPane>
      </Tabs>
    </Modal>
  ) : (
    <Modal
      title="Correlator help"
      visible={isVisible}
      onCancel={onClose}
      footer={null}
      width={'50%'}
    >
      <Tabs>
        <Tabs.TabPane tab="Syntax" key="1">
          <Title>Field names</Title>

          <Paragraph>
            You can specify fields to search in the query syntax:
          </Paragraph>

          <Paragraph>
            <pre>
              status:active # status field contains active
              <br />
              title:(quick OR brown) # title field contains quick or brown
              <br />
              author:"John Smith" # author field contains the exact phrase "john
              smith"
            </pre>
          </Paragraph>

          <Title>Ranges</Title>

          <Paragraph>
            Ranges can be specified for date, numeric or string fields.
            Inclusive ranges are specified with square brackets [min TO max] and
            exclusive ranges with curly brackets {'{'}min TO max{'}'}.
          </Paragraph>

          <Paragraph>
            Examples:
            <pre>
              count:[1 TO 5] # Numbers 1..5
              <br />
              date:{'{'}* TO 2012-01-01{'}'} # Dates before 2012
              <br />
              count:[1 TO 5{'}'} # Numbers from 1 up to but not including 5
              <br />
              age:{'>'}10
              <br />
              age:{'>='}10
              <br />
              age:{'<'}10
              <br />
              age:{'<='}10
            </pre>
          </Paragraph>

          <Title>Boolean operator</Title>

          <Paragraph>
            The preferred operators are + (this term must be present) and -
            (this term must not be present). All other terms are optional. For
            example, this query:
            <pre>quick brown +fox -news</pre>
            states that:
            <pre>
              fox must be present
              <br />
              news must not be present
              <br />
              quick and brown are optional—their presence increases the
              relevance
            </pre>
          </Paragraph>

          <Paragraph>
            The familiar boolean operators AND, OR and NOT (also written &&, ||
            and !) are also supported but beware that they do not honor the
            usual precedence rules, so parentheses should be used whenever
            multiple operators are used together. For instance the previous
            query could be rewritten as:
            <pre>((quick AND fox) OR (brown AND fox) OR fox) AND NOT news</pre>
          </Paragraph>
        </Tabs.TabPane>
        <Tabs.TabPane tab="Fields" key="2">
          <Descriptions size="small" bordered column={1}>
            <Descriptions.Item label="event_first">
              Date and time of first event in rule
            </Descriptions.Item>
            <Descriptions.Item label="event_last">
              Date and time of last event in rule
            </Descriptions.Item>
            <Descriptions.Item label="event_count">
              Number of events in rule
            </Descriptions.Item>
            <Descriptions.Item label="event_timestamp">
              Date and time when rule triggers action
            </Descriptions.Item>
            <Descriptions.Item label="event_severity">
              Event severity as integer value from 0 to 100
            </Descriptions.Item>
            <Descriptions.Item label="event_src_msg">
              Event source message
            </Descriptions.Item>
            <Descriptions.Item label="event_protocol">
              Event protocol
            </Descriptions.Item>
            <Descriptions.Item label="device_vendor">
              Device vendor
            </Descriptions.Item>
            <Descriptions.Item label="device_product">
              Device product
            </Descriptions.Item>
            <Descriptions.Item label="device_version">
              Device version
            </Descriptions.Item>
            <Descriptions.Item label="device_action">
              Device action
            </Descriptions.Item>
            <Descriptions.Item label="sign_id">Signature ID</Descriptions.Item>
            <Descriptions.Item label="sign_category">
              Signature category"
            </Descriptions.Item>
            <Descriptions.Item label="sign_subcategory">
              Signature subcategory
            </Descriptions.Item>
            <Descriptions.Item label="sign_name">
              Signature name
            </Descriptions.Item>
            <Descriptions.Item label="source_ip">Source IP</Descriptions.Item>
            <Descriptions.Item label="source_mac">Source MAC</Descriptions.Item>
            <Descriptions.Item label="source_host">
              Source host
            </Descriptions.Item>
            <Descriptions.Item label="source_port">
              Source port
            </Descriptions.Item>
            <Descriptions.Item label="source_user">
              Source user
            </Descriptions.Item>
            <Descriptions.Item label="destination_ip">
              Destination IP
            </Descriptions.Item>
            <Descriptions.Item label="destination_host">
              Destination host
            </Descriptions.Item>
            <Descriptions.Item label="destination_port">
              Destination port
            </Descriptions.Item>
            <Descriptions.Item label="destination_user">
              Destination user
            </Descriptions.Item>
          </Descriptions>
        </Tabs.TabPane>
      </Tabs>
    </Modal>
  );
};
