import history from './../../utils/history';
import { getContentHeight } from '../../utils';
import { getDepartmentList } from './service';
import { queryServiceByCode } from '../../service/common';
import { reportCmPV_YL } from '../../utils/cloudMonitorHelper';
Component({
  props: {
    componentData: {}
  },
  data: {
    index: 0,
    show: false,
    menus: [],
    cache: {},
    lastCache: {},
    loading: true,
    serviceItem: null,
    contentHeight: getContentHeight()
  },

  async didMount() {
    /* 服务预警， 预约挂号 */
    reportCmPV_YL({
      title: '预约挂号'
    });
    const {
      hospitalDistrictId
    } = this.getQuery();

    try {
      await this.getServiceDetail(); // eslint-disable-next-line no-empty
    } catch (e) {}

    await this.fetchMenus(hospitalDistrictId);
  },

  methods: {
    updateData(data) {
      return new Promise(resolve => this.setData(data, resolve));
    },

    async getServiceDetail() {
      const code = 'hospital_service_code';
      const {
        link,
        uuid,
        title,
        linkType,
        accessMode,
        serviceDesc
      } = await queryServiceByCode(code);
      const serviceItem = {
        url: link,
        accessMode,
        name: title,
        serviceDesc,
        urlType: linkType,
        serviceUUID: uuid
      };
      await this.updateData({
        serviceItem
      });
    },

    getQuery() {
      const {
        $routeConfig
      } = this.$page;
      return $routeConfig.query;
    },

    async fetchProxy(func, ...arg) {
      my.showLoading();
      await func(...arg).finally(my.hideLoading);
    },

    /* 检测缓存 */
    hasCache() {
      const {
        index,
        cache
      } = this.data;
      return (cache[index] || []).length > 0;
    },

    /* 设置缓存 */
    setCache(list) {
      const {
        index: i,
        cache: _cache
      } = this.data;
      const cache = { ..._cache
      };
      cache[i] = list;
      return this.updateData({
        cache
      });
    },

    /* 获取一级列表数据 */
    async fetchMenus(hospitalDistrictId) {
      const params = {
        hospitalDistrictId
      };
      const list = await getDepartmentList(params);
      await this.updateData({
        menus: list,
        loading: false
      });
      /* 获取一级列表下面的第一项的第一个 */

      const departmentId = this.getDepartmentId(0);
      await this.fetchDepartments(departmentId, list[0]);
    },

    /* 获取二级列表 */
    async fetchDepartments(departmentId, item) {
      if (this.hasCache()) return;
      const list = !departmentId ? [item] : await getDepartmentList({
        parentId: departmentId
      });
      this.setCache(list);
    },

    /* 获取科室id */
    getDepartmentId(index) {
      const {
        menus = []
      } = this.data;
      const {
        hasChildren,
        departmentId
      } = menus[index] || {};
      if (hasChildren) return departmentId;
    },

    /* 切换科室 */
    async onTapMenu(i) {
      const item = this.data.menus[i];
      await this.updateData({
        index: i
      });
      const departmentId = this.getDepartmentId(i);
      await this.fetchDepartments(departmentId, item);
    },

    /* 获取三级列表数据 */
    async onTapOpenLast(item) {
      const {
        departmentId
      } = item;
      const {
        lastCache
      } = this.data;
      const cacheList = lastCache[departmentId] || [];
      if (cacheList.length > 0) return cacheList;
      my.showLoading();
      const list = await getDepartmentList({
        parentId: departmentId
      }).finally(my.hideLoading);
      lastCache[departmentId] = list;
      await this.updateData({
        lastCache: { ...lastCache
        }
      });
      return list;
    },

    onTapItem(item) {
      const query = this.getQuery();
      const {
        name: areaName
      } = query;
      const {
        componentData
      } = this.props;
      const {
        departmentId,
        name: dpName
      } = item;
      history.push({
        query: {
          departmentId
        },
        title: `${dpName}（${areaName}）`,
        pageType: 'hospital-num-source',
        componentData: { ...componentData,
          department: item
        }
      });
    }

  }
});