import { action, makeObservable, observable, toJS } from 'mobx';
import { RootStore } from 'stores/RootStore';
import { TPostOs } from './AssetsCardInfo/types';
import { Asset, AssetPatch } from './types';
import {
  TypeCardSize,
  TypeTags,
  TypeTagCreate,
  TUseColumns,
} from 'types/default';
import { environment } from 'enviroments/enviroments';

const {
  endPoints: {
    assets: { groups },
  },
} = environment;

export class AssetsUiStore {
  constructor(private readonly rootStore: RootStore) {
    makeObservable(this);
  }

  @observable checkedColumns: any = [];

  @observable cardSizeValue: TypeCardSize = undefined;

  @observable selectedTag: TypeTagCreate | undefined;

  @observable selectedTagId: string | undefined | null;

  @observable selectedCard: Asset | undefined | null;

  // Todo  --------Работа со столбцами--------
  get getCheckedColumns(): TUseColumns {
    return toJS(this.checkedColumns);
  }

  @action setCheckedColumns = (value: any): any =>
    (this.checkedColumns = value);

  // Todo  -------- Получение из сторы --------
  //Возвращение списка активов
  get assetsList(): any {
    return this.rootStore.assetsStore.list.map((x: any) => {
      return {
        key: x._listRecord.id,
        ...x._listRecord,
      };
    });
  }

  //Возвращение списка производителей
  get manufacturersList(): any {
    return this.rootStore.assetsStore.manufacturers;
  }

  //Возвращение списка операционных систем
  get exportCSV(): any {
    return this.rootStore.assetsStore.exportCSV;
  }

  //Возвращение списка операционных систем
  get osList(): any {
    return toJS(this.rootStore.assetsStore.osList);
  }

  //Размер карточки
  get cardSize(): any {
    return this.cardSizeValue;
  }

  //Возвращение списка тэгов
  get tagsList(): any {
    return this.rootStore.tagsStore.list.map((x: any) => {
      return {
        ...x._tagRecord,
        key: x._tagRecord.id,
      };
    });
  }

  //Возврат выбранной карточки
  get getSelectedCard(): Asset | undefined | null {
    return toJS(this.rootStore.assetsStore.selectedAsset);
  }

  //Возвращение одного тэга по id
  get getSelectedTagId(): string | undefined | null {
    return this.selectedTagId;
  }

  get getSelectedTag(): TypeTagCreate | TypeTags | undefined {
    return toJS(this.selectedTag);
  }

  //Возвращение общего кол-ва активов
  get countAssets(): any {
    return this.rootStore.assetsStore.total;
  }

  //Возвращение общего кол-ва групп
  get countGroups(): any {
    return this.rootStore.tagsStore.totalGroups;
  }

  //Возвращение состояния загрузки
  get loading(): any {
    return this.rootStore.assetsStore.getLoading;
  }

  get loadingCard(): any {
    return this.rootStore.assetsStore.getLoadingCard;
  }
  // Todo --------

  // Todo -------- Загрузка данных и запись в стору --------
  // Получение списка Акстивов
  @action loadingAssetsList = async (
    page: number,
    pageSize: number,
    sorter: string,
  ): Promise<void> =>
    this.rootStore.assetsStore.fetchAssetsList(page, pageSize, sorter);

  //Получение одного Актива по id
  @action loadingAssetRecord = (id: number): any =>
    this.rootStore.assetsStore.fetchAssetRecord(id);

  // Функция для загрузки списка активов
  @action loadingOSList = (): void => this.rootStore.assetsStore.fetchOSList();

  // Функция для загрузки списка тэгов
  @action loadingGroupsList = async (
    page: number,
    pageSize: number,
    sorter: string,
  ): Promise<void> =>
    this.rootStore.tagsStore.fetchGroupsList(
      page && pageSize
        ? `${environment.endPoints.assets.groups}?page=${page}&page_size=${pageSize}${sorter}`
        : `${environment.endPoints.assets.groups}`,
    );

  // Загрузка производителей
  @action loadingManufacturersList = (page: number): void =>
    this.rootStore.assetsStore.fetchManufacturerList(page);

  // Todo --------

  // Todo -------- Создание/Изменение --------

  // Изменение выбранной карточки
  @action setSelectedCard = (value: undefined | null): void => {
    this.rootStore.assetsStore.setSelectedAsset(value);
  };

  // Изменение размера карточки
  @action changeCardSize = (value: TypeCardSize): TypeCardSize =>
    (this.cardSizeValue = value);

  // Изменение статуса Актива
  @action changeStatusAssetsRecords = (mas: number[]): void =>
    this.rootStore.assetsStore.changeStatusAssetsRecs(mas);

  // Изменение статуса Актива
  @action changeStatusAssets = (mas: number[]): void =>
    this.rootStore.assetsStore.changeStatusAssetsRecs(mas);

  // Редактирование статуса Актива
  @action patchAssetsRecord = async (
    id: string,
    data: AssetPatch,
  ): Promise<void> => {
    await this.rootStore.assetsStore
      .patchAssetsRecord(id, data)
      .then(() => this.changeCardSize(undefined));
  };

  // Создания нового тэга
  @action postOsList = (data: TPostOs): void => {
    this.rootStore.assetsStore.postOSList(data);
  };

  // Изменения тэга
  @action patchGroupsList = async (
    data: TypeTags,
    id: number,
  ): Promise<void> => {
    await this.rootStore.tagsStore.patchRecordInGroupsList(groups, data, id);
    this.selectedTag = undefined;
    this.selectedTagId = undefined;
  };

  // Изменения тэга
  @action postGroupsList = async (data: TypeTags): Promise<void> => {
    await this.rootStore.tagsStore.postRecordInGroupsList(groups, data);
    this.selectedTag = undefined;
    this.selectedTagId = undefined;
  };

  // Изенение тэга и его id
  @action setSelectedTag = (id: string | null | undefined): void => {
    switch (id) {
      case undefined:
        this.selectedTag = { name: '', description: '' };
        this.selectedTagId = undefined;
        break;

      case null:
        this.selectedTag = undefined;
        this.selectedTagId = undefined;
        break;

      default:
        this.selectedTag = this.rootStore.tagsStore.record(id).tagRecord;
        this.selectedTagId = id;
        break;
    }
  };

  // Todo --------

  // Todo -------- Удаление --------
  // Удаление одного или нескольких активов
  @action deleteAssetsRecord = async (id: number[]): Promise<void> => {
    await this.rootStore.assetsStore.deleteAssetsRecord(id);
  };

  @action changeAssetsRecord = async (id: number[]): Promise<void> => {
    await this.rootStore.assetsStore.changeStatusAssetsRecs(id);
  };

  // Удаление Тэга/Group
  @action deleteGroupsRecord = async (id: number[]): Promise<void> =>
    this.rootStore.tagsStore.deleteRecordInGroupsList(groups, id);

  // Todo --------
}
