// Libs
// -----------------------------------------------------------------------------
import { makeAutoObservable } from 'mobx';

// App
// -----------------------------------------------------------------------------
import { RootStore } from 'stores/RootStore';
import { EventsJournalRecord } from 'types/default';

export class CorrelationRulesCheckerUiStore {
  constructor(private readonly rootStore: RootStore) {
    makeAutoObservable(this);
  }

  // Проверить условие срабатывания, найти события ему соответствующие
  checkRule = async (query: string): Promise<void> => {
    this.foundEventsTablePage = 1;
    this.foundEventsTablePageSize = 10;
    await this.rootStore.eventsJournalStore.queryEventsJournalList(
      this.foundEventsTablePage,
      this.foundEventsTablePageSize,
      '',
      query,
    );
    this.isRuleModified = false;
    this.isRuleChecked = true;
  };

  // Запущен ли запрос проверки правила
  get isRuleCheckLoading(): boolean {
    return this.rootStore.eventsJournalStore.getLoading;
  }

  // Модифицировано ли правило после проверки запроса
  isRuleModified = false;

  // Запускалась ли проверка этого правила
  isRuleChecked = false;

  // Найденные события по правилу
  get foundEvents(): Array<EventsJournalRecord> {
    return this.rootStore.eventsJournalStore.list.map((x: any) => ({
      ...x._listRecord,
    }));
  }

  get foundEventsCount(): number {
    return this.rootStore.eventsJournalStore.total;
  }

  foundEventsTablePage = 1;

  foundEventsTablePageSize = 10;

  onFoundEventsTablePagination = async (
    pageNumber: number,
    pageSize: number,
    query: string,
  ): Promise<void> => {
    this.foundEventsTablePage = pageNumber;
    this.foundEventsTablePageSize = pageSize;
    await this.rootStore.eventsJournalStore.queryEventsJournalList(
      this.foundEventsTablePage,
      this.foundEventsTablePageSize,
      '',
      query,
    );
  };

  // Очистить состояние проверки правила
  clearFoundEvents = (): void => {
    this.rootStore.eventsJournalStore.entities.clear();
    this.isRuleModified = false;
    this.isRuleChecked = false;
  };

  // Указать что правило модифицировано после проверки
  onRuleInput = (): void => {
    this.isRuleModified = true;
  };

  // Отображать ли диалог с помощью
  helpDialogIsVisible = false;

  // Задать, отображать ли диалог с помощью
  setHelpDialogIsVisible = (newState: boolean): void => {
    this.helpDialogIsVisible = newState;
  };
}
