import { observable, action } from 'mobx';
import { getAppList, getAppDetail, getAppTopicList, applyOrder, modfiyApplication, modfiyAdminApp, getAdminAppList, getAppsConnections, getTopicAppQuota } from 'lib/api';
import { IAppItem, IAppQuota, ITopic, IOrderParams, IConnectionInfo } from 'types/base-type';

class App {
  @observable
  public loading: boolean = false;

  @observable
  public connectLoading: boolean = true;

  @observable
  public data: IAppItem[] = [];

  @observable
  public adminAppData: IAppItem[] = [];

  @observable
  public selectData: IAppItem[] = [{
    appId: '-1',
    name: '所有关联应用',
    } as IAppItem,
  ];

  @observable
  public active: string = '-1';

  @observable
  public baseInfo: IAppItem = {} as IAppItem;

  @observable
  public topicList: ITopic[] = [];

  @observable
  public currentTab: string = '1';

  @observable
  public appsConnections: IConnectionInfo[] = [];

  @observable
  public principal: string = '';

  @observable
  public appQuota: IAppQuota[] = [];

  @action.bound
  public changeActiveApp(data: string) {
    this.active = data;
  }

  @action.bound
  public setTopicAppQuota(data: IAppQuota[]) {
    return this.appQuota = data.map((item, index) => {
       return {
         ...item,
         label: item.appName,
         value: item.appId,
         key: index,
       };
    });
  }

  @action.bound
  public setLoading(value: boolean) {
    this.loading = value;
  }

  @action.bound
  public setConnectLoading(value: boolean) {
    this.connectLoading = value;
  }

  @action.bound
  public setData(data: IAppItem[] = []) {
    this.data = data.map((item, index) => ({
      ...item,
      key: index,
      principalList: item.principals ? item.principals.split(',') : [],
    }));
    const selectData = data.map((item) => ({
      ...item,
      label: item.name,
      value: item.appId,
    }));

    this.selectData.push(...selectData);
    this.setLoading(false);
  }

  @action.bound
  public setAdminData(data: IAppItem[] = []) {
    this.adminAppData = data.map((item, index) => ({
      ...item,
      key: index,
      principalList: item.principals ? item.principals.split(',') : [],
    }));

    this.setLoading(false);
  }

  @action.bound
  public setCurrentTab(data: string) {
    this.currentTab = data;
  }

  @action.bound
  public setAppDetail(data: IAppItem) {
    this.baseInfo = data || {} as IAppItem;
  }

  @action.bound
  public setTopicList(data: ITopic[]) {
    this.topicList = data.map((item, index) => ({
      ...item,
      key: index,
    }));
    this.setLoading(false);
  }

  @action.bound
  public setAppsConnections = (data: IConnectionInfo[]) => {
    this.setConnectLoading(false);
    this.appsConnections = (data || []).map((item, index) => {
      return {
        key: index,
        ...item,
      };
    });
  }

  public getAppList() {
    this.setLoading(true);
    getAppList().then(this.setData);
  }

  public getTopicAppQuota(clusterId: number, topicName: string) {
    return getTopicAppQuota(clusterId, topicName).then(this.setTopicAppQuota);
  }

  public getAdminAppList() {
    this.setLoading(true);
    getAdminAppList().then(this.setAdminData);
  }

  public getAppDetail(appId: string) {
    getAppDetail(appId).then(this.setAppDetail);
  }

  public getAppTopicList(appId: string) {
    this.setLoading(true);
    const mine = this.currentTab === '1';
    getAppTopicList(appId, mine).then(this.setTopicList);
  }

  public applyApplication(params: IOrderParams) {
    return applyOrder(params);
  }

  public modfiyApplication(params: any, from?: string) {
    return from === 'admin' ? this.modfiyAdminApp(params) : modfiyApplication(params).then(() => this.getAppList());
  }

  public modfiyAdminApp(params: any) {
    return modfiyAdminApp(params).then(() => this.getAdminAppList());
  }

  public cancelProdPermission(params: IOrderParams) {
    return applyOrder(params);
  }

  public applyAppOffline(params: IOrderParams) {
    return applyOrder(params);
  }

  public getAppsConnections(appId: string) {
    this.setConnectLoading(true);
    return getAppsConnections(appId).then(this.setAppsConnections);
  }

  public applyExpand(params: IOrderParams) {
    return applyOrder(params);
  }
}

export const app = new App();