import {
  observable,
  action
} from 'mobx';
import * as mobx from 'mobx';
import * as Api from '../apis/department'; // 引入API接口文件
import {
  WeaForm
} from 'comsMobx';
import {
  WeaTableNew
} from 'comsMobx';
import {
  Modal,
  message,
} from 'antd'
import {
  i18n
} from '../public/i18n';
import {
  findIndex
} from 'lodash';

const toJS = mobx.toJS;
const {
  TableStore
} = WeaTableNew;


export class DepartmentStore {
  @observable tableStore = new TableStore();
  @observable topMenu = []
  @observable rightMenu = [];
  @observable dataSource = [];
  @observable columns = [];
  @observable loading = true;
  @observable dialogLoading = true;
  @observable isEdit = true;
  @observable nEdialogTitle = '';
  @observable searchCondition = [];
  @observable condition = [];
  @observable copyCondition = [];
  @observable isPanelShow = false; //高级搜索面板
  @observable form = new WeaForm();
  @observable form1 = new WeaForm(); //合并 转移
  @observable form2 = new WeaForm(); //复制表单
  @observable departmentName = '';
  @observable conditionNum = 4;
  @observable ids = ''; //选择行id
  @observable id = ''; //页面跳转参数id
  @observable searchConditionLoading = true;
  @observable visible = false;
  @observable newVisible = false; //新增弹窗
  @observable departmentId = '';
  @observable selectedRowKeys = [];
  @observable date = '';
  @observable init = true; //是否首次加载
  @observable total = '';
  @observable current = 1;
  @observable pageSize = 10;
  @observable sortParams = [];
  @observable defaultShowLeft = true;
  @observable companysId = 1 //集团id
  @observable postionDataSource = [];
  @observable postionColumns = [];

  @observable confirmVisible = false;
  @observable confirmLoading = true;
  @observable isMerge = true;
  @observable hasRight = '';
  @observable exSpinning = false;

  @observable selectTreeNodeInfo;
  saveAndSetting = false;


  @action getTableInfo() {
    this.setLoading(true);
    let params = {
      ...this.selectTreeNodeInfo,
      current: this.current,
      pageSize: this.pageSize,
      sortParams: this.sortParams
    }
    if (this.isEmptyObject(this.form.getFormParams())) {
      params = {
        ...params,
        departmentName: this.departmentName
      };
    } else {
      params = {
        ...params,
        ...this.form.getFormParams(),
      };
    }
    Api.getSearchList(params).then(response => {
      return response.json()
    }).then(res => {
      if (res.code === 200) {
        this.setHasRight(res.data.hasRight);
        res.data.pageInfo.columns && this.setColumns(res.data.pageInfo.columns);
        this.setTotal(res.data.pageInfo.total);
        res.data.pageInfo.list && this.setDataSource(res.data.pageInfo.list);
        this.setLoading(false);
        this.setInit(false);
      } else {
        message.warning(res.msg);
      }
    }).catch(error => {
      message.warning(error.msg);
    })
  }

  @action("nodetree事件") doSearch(params) {
    this.selectTreeNodeInfo = params;
    this.setCurrent(1);
    this.setPageSize(10);
    this.setInit(true);
    this.getTableInfo();
  }

  @action("联查岗位") getPostionTable(id) {
    let params = {
      parentDept: id
    }
    Api.getPostionTable(params).then(res => {
      if (res.code === 200) {
        res.data.list && this.setPostionDataSource(res.data.list);
        res.data.columns && this.setPostionColumns(res.data.columns);
        this.setDialogLoadingStatus(false);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }

  delete() {
    let params = {
      ids: this.ids
    };
    Api.deleteTableData(params).then(response => {
      return response.json()
    }).then(data => {
      if (data.code === 200) {
        message.success(i18n.message.deleteSuccess());
        this.setSelectedRowKeys([]);
        this.getTableInfo();
      } else {
        message.warning(data.msg);
      }
    }).catch(error => {
      message.warning(error.msg);
    })
  }

  updateForbiddenTag(checked, id) {
    let params = {
      canceled: checked,
      id: id
    }
    Api.updateForbiddenTag(params).then(response => {
      return response.json()
    }).then(data => {
      if (data.code === 200) {
        message.success(data.msg, 1);
        this.getTableInfo();
      } else {
        message.warning(data.msg);
      }
    }).catch(error => {
      message.warning(error.msg);
    })
  }

  getSearchCondition() {
    this.setScLoadingStatus(true);
    Api.getAdvanceSearchCondition().then(res => {
      if (res.code === 200) {
        this.setScLoadingStatus(false);
        res.data.conditions && this.setSearchCondition(res.data.conditions);
        res.data.conditions && this.form.initFormFields(res.data.conditions);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }


  getDeptForm() {
    this.setDialogLoadingStatus(true);
    let params = {
      ...this.selectTreeNodeInfo,
      addType:'normal',
      viewattr:'2'
    }
    Api.getDeptForm(params).then(res => {
      if (res.code === 200) {
        this.setDialogLoadingStatus(false);
        res.data.condition && this.setCondition(res.data.condition);
        res.data.condition && this.form1.initFormFields(res.data.condition);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }

  @action("合并部门") getMergeForm(id) {
    let params = {
      id: id
    };
    this.setConfirmLoading(true);
    Api.getMergeForm(params).then(res => {
      if (res.code === 200) {
        this.setConfirmLoading(false);
        res.data && this.setCondition(res.data);
        res.data && this.form1.initFormFields(res.data);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }

  @action("转移部门") getTransferForm(id) {
    let params = {
      id: id
    };
    this.setConfirmLoading(true);
    Api.getTransferForm(params).then(res => {
      if (res.code === 200) {
        this.setConfirmLoading(false);
        res.data && this.setCondition(res.data);
        res.data && this.form1.initFormFields(res.data);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }

  @action("复制表单") getCopyForm() {
    let params = {};
    Api.getCopyForm(params).then(res => {
      if (res.code === 200) {
        res.data && this.setCopyCondition(res.data);
        res.data && this.form2.initFormFields(res.data);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }


  save() {
    let params = {
      ...this.form1.getFormParams()
    };
    this.form1.validateForm().then(f => {
      if (f.isValid) {
        Api.add(params).then(data => {
          if (data.code === 200) {
            message.success(data.msg);
            this.getTableInfo();
            this.setNewVisible(false);
            this.saveAndSetting && window.open(`/spa/organization/static/index.html#/main/organization/departmentExtend/${data.data}`, "_blank")
          } else {
            message.warning(data.msg);
          }
        }).catch(error => {
          message.warning(error.msg);
        })
      } else {
        f.showErrors();
        this.setDate(new Date());
      }
    });
  }

  @action("合并") merge() {
    let params = {
      id: this.ids,
      ...this.form1.getFormParams()
    };
    this.form1.validateForm().then(f => {
      if (f.isValid) {
        Api.merge(params).then(response => {
          return response.json()
        }).then(data => {
          if (data.code === 200) {
            message.success(data.msg);
            this.getTableInfo();
            this.setConfirmVisible(false);
          } else {
            message.warning(data.msg);
          }
        }).catch(error => {
          message.warning(error.msg);
        })
      } else {
        f.showErrors();
        this.setDate(new Date());
      }
    });
  }

  @action("转移") transfer() {
    let params = {
      id: this.ids,
      ...this.form1.getFormParams()
    };
    this.form1.validateForm().then(f => {
      if (f.isValid) {
        Api.transfer(params).then(response => {
          return response.json()
        }).then(data => {
          if (data.code === 200) {
            message.success(data.msg);
            this.getTableInfo();
            this.setConfirmVisible(false);
          } else {
            message.warning(data.msg);
          }
        }).catch(error => {
          message.warning(error.msg);
        })
      } else {
        f.showErrors();
        this.setDate(new Date());
      }
    });
  }

  @action("复制") copy() {
    let params = {
      ids: this.ids,
      ...this.form2.getFormParams()
    };
    Api.copy(params).then(response => {
      return response.json()
    }).then(data => {
      if (data.code === 200) {
        message.success(data.msg);
        this.getTableInfo();
        this.setSelectedRowKeys([]);
      } else {
        message.error(data.msg);
      }
    }).catch(error => {
      message.warning(error.msg);
    })

  }


  @action getHasRight() {
    Api.getHasRight().then(res => {
      if (res.code === 200) {
        res.data.rightMenu && this.setRightMenu(res.data.rightMenu);
        res.data.topMenu && this.setTopMenu(res.data.topMenu);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }

  @action("另存为版本") version(id) {
    Api.version({id:id}).then(res => {
      if (res.code === 200) {
        message.success(res.msg);
      } else {
        message.warning(res.msg);
      }
    }, error => {
      message.warning(error.msg);
    })
  }

  @action("全部导出") async  exportData() {
    this.exSpinning = true;
    await Api.exportData();
    this.exSpinning = false;
  }


  updateFields(val) {
    this.form.updateFields({
      departmentName: {
        value: val
      }
    });
  }

  setSearchCondition(condition) {
    this.searchCondition = condition;
  }

  setScLoadingStatus(bool) {
    this.searchConditionLoading = bool;
  }

  setPanelStatus(bool) {
    this.isPanelShow = bool;
    bool && this.getSearchCondition();
    if (!bool) {
      this.scLoadingReset();
    }
  }

  setDepartmentName(val) {
    this.departmentName = val;
  }

  isEmptyObject(obj) {
    for (let key in obj) {
      return false;
    }
    return true;
  }

  setIds(ids) {
    this.ids = ids;
  }

  setId(id) {
    this.id = id;
  }

  scLoadingReset() {
    this.searchConditionLoading = true;
  }


  formReset() {
    this.form1 = new WeaForm();
  }


  setVisible(bool) {
    this.visible = bool;
  }

  setDialogLoadingStatus(bool) {
    this.dialogLoading = bool;
  }


  setSearchCondition(searchCondition) {
    this.searchCondition = searchCondition;
  }

  setDepartmentId(departmentId) {
    this.departmentId = departmentId;
  }

  setDate(date) {
    this.date = date;
  }

  setTopMenu(topMenu) {
    this.topMenu = topMenu;
  }

  setRightMenu(rightMenu) {
    this.rightMenu = rightMenu;
  }

  setDataSource(dataSource) {
    this.dataSource = dataSource;
  }

  setColumns(columns) {
    this.columns = columns
  }

  setSelectedRowKeys(selectedRowKeys) {
    this.selectedRowKeys = selectedRowKeys;
  }

  setLoading(bool) {
    this.loading = bool;
  }

  setNeDialogTitle(title) {
    this.nEdialogTitle = title
  }

  setCondition(condition) {
    this.condition = condition;
  }

  setCopyCondition(copyCondition) {
    this.copyCondition = copyCondition;
  }

  setNewVisible(bool) {
    this.formReset();
    this.newVisible = bool;
  }

  setTotal(total) {
    this.total = total;
  }

  setCurrent(current) {
    this.current = current;
  }

  setPageSize(pageSize) {
    this.pageSize = pageSize;
  }

  setInit(bool) {
    this.init = bool;
  }

  setConfirmVisible(confirmVisible) {
    this.formReset();
    this.confirmVisible = confirmVisible;
  }

  setConfirmLoading(confirmLoading) {
    this.confirmLoading = confirmLoading;
  }

  setPostionDataSource(postionDataSource) {
    this.postionDataSource = postionDataSource;
  }

  setPostionColumns(postionColumns) {
    this.postionColumns = postionColumns;
  }

  setIsMerge(bool) {
    this.isMerge = bool;
  }

  setHasRight(bool) {
    this.hasRight = bool;
  }

  setSortParams(sorter) {
    this.sortParams = [];
    sorter.order && this.sortParams.push({
      orderkey: sorter.field,
      sortOrder: sorter.order
    })
  }

  setSaveAndSetting(bool) {
    this.saveAndSetting = bool;
  }
}