/* eslint-disable no-undef */
import React from 'react';

import { Anchor, message } from 'antd';
import classNames from 'classnames';
import { encode } from 'js-base64';
import Cookies from 'js-cookie';

import { cityJson } from '@wisdom-utils/utils';
import { CitySelector } from '@wisdom-utils/components';
import { appService } from '../api';
import Login from '../pages/user/login/login';
import styles from './BasicLayout.less';
// import { initMicroApps } from '../micro'
// import actions from '../actions';
const { Link } = Anchor;

const ERR_OK = '0000';
class Site {
  constructor(props, callback) {
    this.weatherCity = null;
    this.globalConfig = props.global;
    this.updateConfig = props.updateConfig;
    this.props = props;
    this.init();
    this.setLoading = callback;
  }

  init(config) {
    // this.initWeatherCity();
  }

  setGlobalConfig(config) {
    this.globalConfig = config;
  }

  initWeatherCity() {
    try {
      if (navigator.onLine && this.globalConfig && this.globalConfig.userInfo && this.globalConfig.userInfo.site) {
        // eslint-disable-next-line no-undef
        appService.getCity().then(res => {
          // eslint-disable-next-line no-restricted-globals
          if (res && !isNaN(res.cid)) {
            const cityResult = JSON.parse(cityJson);
            const city = cityResult[res.cid];
            this.weatherCity = city || null;
          }
        });
      }
    } catch (e) {
      // eslint-disable-next-line no-console
      console.error(e);
    }
  }

  getCityStationsForUser() {
    const { token } = this.globalConfig.userInfo;
    const self = this;
    return new Promise((resolve, reject) => {
      // eslint-disable-next-line no-undef
      appService
        .getAllGroupsInfoForUser({
          token,
          'request.preventCache': new Date().getTime(),
          ignoreSite: true,
        })
        .then(res => {
          if (res && res.code === 0) {
            const result = res.data || [];
            let city = self.weatherCity;
            let arr = [];
            self.globalConfig.userInfo.groupType = '';
            self.globalConfig.userInfo.Groups = result;
            // eslint-disable-next-line no-array-constructor
            self.globalConfig.userInfo.Industries = new Array();
            if (self.globalConfig.userInfo.Groups && self.globalConfig.userInfo.Groups.length) {
              self.globalConfig.userInfo.Groups.forEach(group => {
                if (group.industry && self.globalConfig.userInfo.Industries.indexOf(group.industry) < 0)
                  self.globalConfig.userInfo.Industries.push(group.industry);
              });
            }
            if (
              self.globalConfig.userInfo &&
              self.globalConfig.userInfo.site &&
              self.globalConfig.userInfo.Groups &&
              self.globalConfig.userInfo.Groups.length
            ) {
              // eslint-disable-next-line no-underscore-dangle
              const _indestryItem = self.globalConfig.userInfo.Groups.find(
                // eslint-disable-next-line eqeqeq
                item => item.site === self.globalConfig.userInfo.site,
              );
              if (_indestryItem && _indestryItem.industry) {
                self.globalConfig.Industry = _indestryItem.industry;
              }
            }

            let allStation = [];
            let projectStation = [];
            self.showStations = [];
            if (self.globalConfig.Industry) {
              allStation = result.filter(item => item.industry === self.globalConfig.Industry);
              self.showStations = allStation.filter(item => item.promoteIndex && item.promoteIndex > 0);
              projectStation = allStation.filter(item => !item.promoteIndex);
            } else {
              allStation = result;
            }

            if (allStation.length) {
              let allChoice = false;
              allStation.forEach(val => {
                if (val.promoteIndex === 0) {
                  allChoice = true;
                }
              });
              if (!allChoice) {
                // me.$el.find('#changeCityWays').hide();
                // me.$el.find('.LMBcityBox').hide();
                // me.$el.find('div.cities').css('min-width', 'initial');
                // me.$el.find('.focusStations').addClass('LMBcolumnList');
              }
              if (allStation.length > 120) {
                // $(me.el).find("div.cities div.cityContent").css("height", '335px');
              }
              // eslint-disable-next-line no-underscore-dangle
              let _enterprise = null;
              if (self.globalConfig.userInfo.site && self.globalConfig.userInfo.site.length) {
                _enterprise = allStation.filter(
                  enterprise =>
                    // eslint-disable-next-line eqeqeq
                    enterprise.site === self.globalConfig.userInfo.site,
                );
              }
              if (_enterprise && _enterprise.length) {
                if (_enterprise[0].groupName.indexOf('演示' >= 0)) {
                  arr[0] = _enterprise[0].groupName;
                } else {
                  arr = _enterprise[0].city.split('/');
                }
                const tmp = _enterprise[0].city.split('/')[1];
                city = tmp.substr(0, tmp.length - 1);
                self.globalConfig.userInfo.groupType = _enterprise[0].groupType;
              } else {
                arr = allStation[0].city.split('/');
                const tmp = arr[1];
                city = tmp.substr(0, tmp.length - 1);
                self.globalConfig.userInfo.groupType = allStation[0].groupType;
              }
            }
            if (allStation.length > 0) {
              self.currentStationName = arr[arr.length - 1];
              self.citySelector = self.AvailableofRegionName(projectStation);
              self.siteCityList = self.buildCitySelectTemple(projectStation);
            }
            // 只有演示环境出现友好提示
            if (allStation.length === self.showStations.length) {
              self.isOnlyDisplay = true;
            } else {
              self.citySelector = self.AvailableofRegionName(projectStation);
              self.siteCityList = self.buildCitySelectTemple(projectStation);
            }

            // eslint-disable-next-line no-unused-expressions
            self.updateConfig && self.updateConfig(self.globalConfig);

            const stations = self.insertYSStation();

            if (city) {
              // eslint-disable-next-line no-undef
              appService
                .getWeather({
                  city,
                  'request.preventCache': new Date().getTime(),
                  ignoreSite: true,
                })
                // eslint-disable-next-line no-shadow
                .then(res => {
                  if (res.say.statusCode === ERR_OK) {
                    const firtValue = res.getMe[0];
                    if (firtValue.cityName) {
                      const text = firtValue.forcastFirst.split(' ')[1];
                      const imgPath = firtValue.presentPictureFirst.replace('gif', 'svg');
                      resolve({
                        stations,
                        allStation,
                        weathers: {
                          icon: `https://panda-water.cn/web4/assets/images/weather2/${imgPath}`,
                          text: `${text}      ${firtValue.temperatureFirst}`,
                        },
                        siteCityList: self.siteCityList,
                        citySelector: self.citySelector,
                        currentStationName: self.currentStationName,
                      });
                    }
                  } else {
                    resolve({
                      stations,
                      allStation,
                      siteCityList: self.siteCityList,
                      citySelector: self.citySelector,
                      currentStationName: self.currentStationName,
                      weathers: {},
                    });
                  }
                })
                .catch(error => {
                  resolve({
                    stations,
                    allStation,
                    currentStationName: self.currentStationName,
                    weathers: {},
                    siteCityList: self.siteCityList,
                    citySelector: self.citySelector,
                  });
                });
            } else {
              resolve({
                stations,
                allStation,
                currentStationName: self.currentStationName,
                weathers: {},
                siteCityList: self.siteCityList,
                citySelector: self.citySelector,
              });
            }
          }
        });
    });
  }

  insertYSStation() {
    const hot = ['HOT', '县', '市', 'New'];
    this.showStations.sort((a, b) => a.promoteIndex - b.promoteIndex);
    return this.showStations.map((item, index) => {
      let marginRight = 20;
      const style = {};
      switch (item.promoteTip) {
        case hot[3]:
        case hot[0]:
          marginRight = 40;
          break;
        case hot[1]:
        case hot[2]:
          marginRight = 30;
          break;
        default:
          marginRight = 20;
          break;
      }
      style.marginRight = marginRight;
      // eslint-disable-next-line no-param-reassign
      item.style = style;
      if (item.promoteTip && hot.includes(item.promoteTip)) {
        // eslint-disable-next-line no-param-reassign
        item.promoteTip = item.promoteTip;
      } else if (index === this.showStations.length) {
        // eslint-disable-next-line no-param-reassign
        item.style.marginRight = '-20px';
      }
      return item;
    });
  }

  getNumberofRegion(data, index) {
    const arr = [];
    const pNames = [];
    // eslint-disable-next-line no-plusplus
    for (let i = 0; i < data.length; i++) {
      const pName = data[i].city.split('/')[index];
      if (pNames.indexOf(pName) < 0) {
        pNames.push(pName);
      }
    }

    pNames.forEach(item => {
      arr[arr.length] = {
        proviceName: item,
        num: 0,
      };
    });

    // eslint-disable-next-line no-plusplus
    for (let j = 0; j < data.length; j++) {
      const itemJ = data[j];
      // eslint-disable-next-line camelcase
      const itemJ_pName = itemJ.city.split('/')[index];
      // eslint-disable-next-line no-plusplus
      for (let k = 0; k < arr.length; k++) {
        const itemK = arr[k];
        // eslint-disable-next-line camelcase
        if (itemJ_pName === itemK.proviceName) {
          // eslint-disable-next-line no-plusplus
          arr[k].num++;
        }
      }
    }
    return arr;
  }

  writeCookie(token, site, onChangeVisible, actionRef, accessToken) {
    const date = new Date();
    date.setTime(date.getTime() + 24 * 60 * 60 * 1000);
    // date = date.toGMTString();
    Cookies.set('token', token, {
      expires: date,
      path: '/',
    });

    localStorage.setItem('access_token', accessToken);

    const encodeSite = encode(encodeURIComponent(site));
    Cookies.set('site', encodeSite, {
      expires: date,
      path: '/',
    });

    const loginSite = this.getLocalSites();
    loginSite[token] = site;
    localStorage.setItem('loginSite', JSON.stringify(loginSite));
    const self = this;
    // self.props.updateCurrentIndex && self.props.updateCurrentIndex(-1);
    const login = new Login(this.props, () => {
      self.setLoading(false);
      self.getCityStationsForUser().then(res => {
        window.share.event.emit('updateSite', res);
      });
      // eslint-disable-next-line no-unused-expressions
      self.props.updateCurrentIndex && self.props.updateCurrentIndex(0);
      // debugger
      // initMicroApps();
      // 切换站点后,重置掉三级菜单

      const homeType = self.globalConfig.homeType || 'civweb4';
      const homePath = self.globalConfig.homepage
        ? self.globalConfig.homepage.startsWith(homeType)
          ? self.globalConfig.homepage
          : `/${homeType}/${self.globalConfig.homepage}`
        : `/${homeType}`;
      window.share &&
        window.share.event &&
        window.share.event.emit('event:favitor', {
          name: '首页',
          path: homePath,
          icon: null,
        });

      actionRef && actionRef.current && actionRef.current.reload();

      // 重新加载订阅消息铃铛
      window.share && window.share.event && window.share.event.emit('reloadNotice');
      const config = self.globalConfig;
      const url = !config.home
        ? config.homepage === '' || _.isNull(config.homepage)
          ? `/civweb4`
          : `/${config.homepage.replace(/^\//, '')}`
        : `/${config.homepage.replace(/^\//, '')}`;
      self.props.history && self.props.history.push(url);
      self.props && self.props.updateCollapsed && self.props.updateCollapsed(false);
      window.share.event.emit('triggerMicro', this.props.global);
      onChangeVisible && onChangeVisible(false);
    });
    login.init();
  }

  changeGroup(event, item, onChangeVisible, actionRef) {
    // debugger
    event.persist();
    const site = item ? item.site : event.target.dataset.site;
    const { token } = this.globalConfig.userInfo;
    this.setLoading(true);
    if (token) {
      this.beforeChangeCheck(token, site, onChangeVisible, actionRef);
    } else {
      this.setLoading(false);
      message.warning('切换企业失败');
    }
  }

  beforeChangeCheck(token, site, onChangeVisible, actionRef) {
    const userParam = {
      token,
      subOID: 'subOID',
      site,
      ignoreSite: true,
    };
    const gateWayParam = {
      _site: site,
    };
    Promise.all([appService.getUserInfo(userParam), appService.getWateWayConfig(gateWayParam)])
      .then(results => {
        const res = results[0];
        const gatewayRes = results[1];
        if (res.code !== 0) {
          this.setLoading(false);
          message.error('获取用户信息失败');
        }
        const config = window?.globalConfig;
        config.uiwidgets = [];
        config.widgets = [];
        config.allWidgets = [];
        config.userInfo = window?.globalConfig?.transformUserInfo?.(res.data) ?? res.data;
        // 重置网关配置
        // eslint-disable-next-line prettier/prettier, no-undef
        const hasGateWay = !gatewayRes || !gatewayRes.data ? false : _.isString(gatewayRes.data) ? JSON.parse(gatewayRes.data) : (typeof gatewayRes.data === 'boolean' ? gatewayRes.data : false);
        config.hasGateWay = hasGateWay;
        config.apiGatewayDomain = `${window.location.origin}${hasGateWay ? '/PandaCore/GateWay' : ''}`;
        if (hasGateWay) {
          appService
            .authorizationToken({
              loginName: config.userInfo?.loginName || '',
              type: 'WorkNo',
            })
            .then(tokenRes => {
              const accessToken = tokenRes.data?.access_token ?? null;
              config.access_token = accessToken;
              localStorage.setItem('access_token', accessToken);
              this.writeCookie(token, site, onChangeVisible, actionRef, accessToken);
            })
            .catch(err => {
              this.setLoading(false);
              config.access_token = null;
              this.writeCookie(token, site, onChangeVisible, actionRef, null);
            });
        } else {
          config.access_token = null;
          localStorage.setItem('access_token', null);
          this.writeCookie(token, site, onChangeVisible, actionRef, null);
        }
      })
      .catch(err => {
        this.setLoading(false);
        message.warning('企业切换失败,请联系管理员排查问题!');
      });
  }

  pySegSort(data) {
    if (!String.prototype.localeCompare) return null;
    let letters;
    const segs = []; // 存放数据
    const py = []; // 存放首字母
    const res = {};
    // eslint-disable-next-line prefer-const
    letters = 'ABCDEFGHJKLMNOPQRSTWXYZ'.split('');
    const ref = {
      A: {
        pName: ['安徽省'],
        data: [],
      },
      B: {
        pName: ['北京市'],
        data: [],
      },
      C: {
        pName: ['重庆市'],
        data: [],
      },
      F: {
        pName: ['福建省'],
        data: [],
      },
      G: {
        pName: ['甘肃省', '广东省', '广西壮族自治区', '贵州省'],
        data: [],
      },
      H: {
        pName: ['海南省', '河北省', '河南省', '黑龙江省', '湖北省', '湖南省'],
        data: [],
      },
      J: {
        pName: ['吉林省', '江苏省', '江西省'],
        data: [],
      },
      L: {
        pName: ['辽宁省'],
        data: [],
      },
      N: {
        pName: ['内蒙古自治区', '宁夏回族自治区'],
        data: [],
      },
      Q: {
        pName: ['青海省'],
        data: [],
      },
      S: {
        pName: ['山东省', '山西省', '陕西省', '上海市', '四川省'],
        data: [],
      },
      T: {
        pName: ['天津市'],
        data: [],
      },
      X: {
        pName: ['新疆维吾尔自治区', '西藏藏族自治区'],
        data: [],
      },
      Y: {
        pName: ['云南省'],
        data: [],
      },
      Z: {
        pName: ['浙江省'],
        data: [],
      },
    };
    // eslint-disable-next-line array-callback-return
    data.map(item => {
      const { proviceName } = item;
      // eslint-disable-next-line no-restricted-syntax
      for (const key in ref) {
        if (ref[key].pName.includes(proviceName)) {
          ref[key].data.push(item);
          break;
        }
      }
    });
    // eslint-disable-next-line array-callback-return
    letters.map(item => {
      if (ref[item] && ref[item].data.length) {
        py.push(item);
        segs.push({
          letter: item,
          data: ref[item].data,
        });
      }
    });
    res.segs = segs;
    res.py = py;
    return res;
  }

  handEnd = (event, item) => {
    event.persist();
    const self = this;
    if (item) {
      const { token } = self.globalConfig.userInfo;
      this.setLoading(true);
      if (token) {
        this.beforeChangeCheck(token, item.site);
      } else {
        this.setLoading(false);
        message.warning('切换企业失败');
      }
    }
  };

  AvailableofRegionName(data) {
    const options = {
      proviceOption: this.getNumberofRegion(data, 0),
      cityOption: this.getNumberofRegion(data, 1),
      siteOption: data,
    };
    return <CitySelector simple Clickable={options} handEnd={(event, item) => this.handEnd(event, item)} />;
  }

  buildCitySelectTemple(data) {
    const arr = [];
    const pNames = [];
    // eslint-disable-next-line no-plusplus
    for (let i = 0; i < data.length; i++) {
      const pName = data[i].city.split('/')[0];
      if (pNames.indexOf(pName) < 0) {
        pNames.push(pName);
      }
    }

    pNames.forEach((item, index) => {
      arr[arr.length] = {
        proviceName: item,
        stations: [],
      };
    });

    // eslint-disable-next-line no-plusplus
    for (let j = 0; j < data.length; j++) {
      const itemJ = data[j];
      // eslint-disable-next-line camelcase
      const itemJ_pName = itemJ.city.split('/')[0];
      // eslint-disable-next-line no-plusplus
      for (let k = 0; k < arr.length; k++) {
        const itemK = arr[k];
        // eslint-disable-next-line camelcase
        if (itemJ_pName === itemK.proviceName) {
          arr[k].stations[itemK.stations.length] = {
            stationID: itemJ.groupID,
            site: itemJ.site,
            cityName: itemJ.city,
            groupName: itemJ.groupName,
            isDeployed: itemJ.isDeployed,
          };
        }
      }
    }

    const cities = this.pySegSort(arr);

    const letters = [];

    // eslint-disable-next-line no-plusplus
    for (let i = 0; i < cities.py.length; i++) {
      letters.push(
        <li key={cities.py[i][0]}>
          <Link
            className={styles.cityLetter}
            href={`#${cities.py[i][0]}`}
            dataHref={cities.py[i][0]}
            title={cities.py[i][0]}
          />
        </li>,
      );
    }
    const children = [];
    // eslint-disable-next-line no-plusplus
    for (let j = 0; j < cities.segs.length; j++) {
      const item = cities.segs[j];

      children.push(
        <div key={j}>
          <a className={styles.letter} href={`${item.letter}`} title={item.letter} id={item.letter}>
            {item.letter}
          </a>
          {item.data.map((k, i) => {
            const city = k;
            let pName = '';
            if (city.proviceName.indexOf('黑龙江' || '内蒙古') < 0) {
              pName = city.proviceName.substr(0, 2);
            } else {
              pName = city.proviceName.substr(0, 3);
            }
            return (
              <div className={styles.Provice} key={i}>
                <span className={styles.proviceName}>{pName}</span>
                <ul className={styles.city_list}>
                  {/* eslint-disable-next-line no-shadow */}
                  {city.stations.map((item, index) => (
                    <li key={item.cityName + index}>
                      <a
                        className={classNames(styles.city_select, !item.isDeployed ? styles.noData : '')}
                        title={item.cityName}
                        onClick={event => this.changeGroup(event, item)}
                      >
                        {item.groupName}
                      </a>
                    </li>
                  ))}
                </ul>
              </div>
            );
          })}
        </div>,
      );
    }
    return {
      letters,
      content: children,
    };
  }

  getLocalSites() {
    const localSite = localStorage.getItem('loginSite');
    let value = {};
    if (localSite) {
      value = JSON.parse(localSite);
    }
    return value;
  }
}

export default Site;