import { makeAutoObservable, toJS } from 'mobx';
import { RootStore } from 'stores/RootStore';
import { TypeRecommendationOrEffectsList } from 'stores/IncidentsStore';
import { TUseColumns, TypeCardSize } from 'types/default';
import { Incident, IncidentEdit } from 'myApi';
import { TypeDashboardPaginationState } from '../../components/Dashboard/types';
import { TypeNCIRCCStatusButtonText } from './IncidentsCardInfo/types';

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

  checkedColumns: TUseColumns[] = [];

  incidentInfo: Incident | null = null;

  // Текущая страница таблицы инцидентов
  currentPage = 1;

  // Число элементов на странице таблицы инцидентов
  pageSize = 10;

  // Поле сортировки для таблицы инцидентов
  sorterField = '';

  // Размер карточки инцидентов
  incidentCardSize: TypeCardSize = undefined;

  // Размер карточки уведомления в госсопку
  ncirccNotificationCardSize: TypeCardSize = undefined;

  // Заблокирована ли форма
  isFormDisabled = true;

  // Если выбрано "Назначен на:" то необходимо установить поле в true и выбрать пользователя из списка.
  isAssignTo = false;

  get incidentsList(): Incident[] {
    return this.rootStore.incidentsStore.list.map(
      (x: { _listRecord: Incident }) => {
        return {
          ...x._listRecord,
          id: x._listRecord.user_friendly_id,
        };
      },
    );
  }

  get isFormStatus(): boolean {
    return this.isFormDisabled;
  }

  // Получение пагинации для таблицы источников событий
  get dashboardState(): TypeDashboardPaginationState {
    return {
      current: this.currentPage,
      pageSize: this.pageSize,
      total: this.countIncidents,
    };
  }

  setIsAssignTo = (value: boolean): void => {
    this.isAssignTo = value;
  };

  // Смена пагинации таблицы источников событий
  setIncidentsDashboardState = (current: number, pageSize: number): void => {
    this.currentPage = current;
    this.pageSize = pageSize;
  };

  // Установить блокировку формы
  setIsDisabledForm = (newState: boolean): void => {
    this.isFormDisabled = newState;
  };

  // Задать размер карточки инцидентов
  setIncidentCardSize = (newCardSize: TypeCardSize): void => {
    this.incidentCardSize = newCardSize;
  };

  // Закрытие карточки инцидентов
  closeIncidentCard = (): void => {
    this.incidentCardSize = undefined;
    this.isFormDisabled = true;

    // сброс уведомления
    this.rootStore.ncirccStore.resetNotificationById();
    this.rootStore.ncirccStore.setIsAdditionNotification(
      TypeNCIRCCStatusButtonText.Send,
    );
  };

  // Закрытие карточки уведомления в Госсопку
  setNcirccNotificationCard = (value: TypeCardSize): void => {
    this.ncirccNotificationCardSize = value;
  };

  // Получение поля сортировки при его изменении
  get getSorterField(): string {
    return this.sorterField;
  }

  // Изменение поля сортировки
  setSorterField = (value: string): void => {
    this.sorterField = value;
  };

  // Переключение размера карточки
  toggleIncidentCardSize = (): void => {
    this.incidentCardSize =
      this.incidentCardSize === 'small' ? 'large' : 'small';
  };

  fetchAllIncidents = async (): Promise<void> => {
    await this.rootStore.incidentsStore.fetchIncidentsList(
      this.dashboardState.current,
      this.dashboardState.pageSize,
      this.getSorterField,
    );
  };

  get incidentById(): Incident | null {
    return toJS(this.rootStore.incidentsStore.incident);
  }

  get effectsList(): TypeRecommendationOrEffectsList {
    return toJS(this.rootStore.incidentsStore.effectsList);
  }

  get recommendationsList(): TypeRecommendationOrEffectsList {
    return toJS(this.rootStore.incidentsStore.recommendationsList);
  }

  get countIncidents(): number {
    return this.rootStore.incidentsStore.total;
  }

  get loading(): boolean {
    return this.rootStore.incidentsStore.getLoading;
  }

  fetchSelectedIncident = async (id: string): Promise<void> => {
    await this.rootStore.incidentsStore.fetchIncidentById(id);
  };

  patchIncident = async (id: string, data: IncidentEdit): Promise<void> => {
    await this.rootStore.incidentsStore.patchIncident(id, data);
  };

  resolveIncident = async (id: string): Promise<void> => {
    await this.rootStore.incidentsStore.patchIncident(id, { status: 3 });
    this.setIncidentCardSize(undefined);
    this.isFormDisabled = true;
  };

  exportCSV = async (): Promise<void> => {
    await this.rootStore.incidentsStore.exportCSV();
  };

  loadingRecommendations = async (page: number): Promise<void> => {
    await this.rootStore.incidentsStore.fetchRecommendations(page);
  };

  loadingEffects = async (page: number): Promise<void> => {
    await this.rootStore.incidentsStore.fetchEffects(page);
  };

  get getCheckedColumns(): TUseColumns[] {
    return toJS(this.checkedColumns);
  }

  setCheckedColumns = (value: TUseColumns[]): void => {
    this.checkedColumns = value;
  };
}
