import React, { useContext } from 'react';
import './index.less';
import { Avatar, ConfigProvider, Form, Input, message, Modal, Popover, Spin, Upload } from 'antd';
import { withRouter } from 'react-router';
import { request } from '@wisdom-utils/utils';
import { FormattedMessage, useIntl } from '@wisdom-utils/components/lib/AppLayout/locales/localeExports';

import globalHeader from '@wisdom-utils/components/lib/AppLayout/locales/zh-CN/globalHeader';
import { appService } from '@wisdom-utils/components/lib/AppLayout/notifier/api';
import { API } from '@wisdom-utils/components/lib/AppLayout/notifier/api/service/user';
// eslint-disable-next-line import/named

const GlobalContext = React.createContext(ConfigProvider.ConfigContext);
const formItemLayout = {
  labelCol: {
    xs: { span: 4 },
    sm: { span: 4 },
  },
};

/* eslint-disable */
const getIOT = () =>
  window.globalConfig.loginTemplate === 'Dark - IOTMultiLogin.html' ||
  window.globalConfig.loginTemplate === '新春 - 智联.html';

class AvatarDropdown extends React.Component {
  /* eslint-disable no-unused-vars */

  constructor(props) {
    super(props);
    let {
      currentUser = {
        avatar: this.transformAvatarImage(),
        name:
          (props.config && props.config.userInfo && props.config.userInfo.fullName) || 'Serati Ma',
      },
    } = this.props;
    this.state = {
      currentUser: currentUser,
      visible: false,
      popVisible: false,
      path: null,
      version: null,
      action: API.UPLOAD_FILE_URL,
    };
  }
  loginout = (event) => {
    // eslint-disable-next-line no-undef
    this.props.logout();
    if (
      window.globalConfig.style === 'ios' &&
      window.globalConfig.loginTemplate === 'IOSCloud.html'
    ) {
      window.location.href = `${window.location.origin}/#login`;
      return false;
    }
    // console.log(this.props)
    // this.props.history.push('/login')
    // window.location.reload();
    //
  };

  getRoles = () => {
    const roles = this.props.config.userInfo.roles || [];
    const ret = [];
    roles.forEach((item) => {
      ret.push(item.name);
    });
    return ret.join(',');
  };

  showModal = (event) => {
    event.stopPropagation();
    this.setState({
      visible: true,
    });
  };

  handleOk = (event, form) => {
    event.stopPropagation();
    form
      .validateFields()
      .then((res) => {
        const params = getIOT()
          ? {
              newPassword: res.newPwd,
              phone: window.globalConfig.userInfo.Phone,
            }
          : {
              password: res.oldPwd,
              newpassword: res.newPwd,
              token: window.globalConfig.token,
            };
        appService
          .changePassword(params)
          .then((res) => {
            if (res.success) {
              //message.success(useIntl().formatMessage({id: 'component.account.password.update.success'}));
              message.success(globalHeader['component.account.password.update.success']);
              setTimeout(() => {
                this.setState({
                  visible: false,
                });
              }, 300);
            } else {
              message.error(
                useIntl().formatMessage({ id: 'component.account.oldpassword.errorMessage' }),
              );
            }
          })
          .catch((error) => {
            message.error(
              useIntl().formatMessage({ id: 'component.account.password.update.fail' }),
            );
          });
      })
      .catch((error) => {
        console.log(error);
      });
  };

  handleCancel = (event, form) => {
    event.stopPropagation();
    form.resetFields();
    this.setState({
      visible: false,
    });
  };

  transformAvatarImage() {
    const { userInfo } = this.props.config;
    const defaultImage = `${window.location.origin}/civweb4/assets/images/icon/熊猫新2.png`;
    let image = defaultImage;
    if (userInfo && userInfo.UserImge && userInfo.UserImge.indexOf('个人信息') > -1) {
      image = `/cityinterface/rest/services/filedownload.svc/download/${userInfo.UserImge}`;
    } else if (
      userInfo.UserImge &&
      userInfo.UserImge !== '' &&
      userInfo.UserImge !== 'default_user.png'
    ) {
      image = userInfo.UserImge;
    } else if (userInfo.WxImage && userInfo.WxImage !== '') {
      image = userInfo.WxImage;
    }
    return image;
  }

  beforeUpload(file) {
    const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
    if (!isJpgOrPng) {
      message.error('You can only upload JPG/PNG file!');
    }
    const isLt2M = file.size / 1024 / 1024 < 2;
    if (!isLt2M) {
      message.error('Image must smaller than 2MB!');
    }
    const path = new Date().getTime();
    this.setState({
      path: path,
      action: this.state.action.replace('{path}', path).replace('{filename}', file.name),
    });
    return isJpgOrPng && isLt2M;
  }

  handleChange(data) {
    console.log(data);
  }

  componentDidMount() {
    appService
      .getVersion({
        ignoreSite: true,
      })
      .then((res) => {
        if (res.success) {
          this.setState({
            version: res.message,
          });
        }
      })
      .catch((error) => {
        message.error(useIntl().formatMessage({ id: 'component.getVersion.errorMessage' }));
      });
  }

  customRequest = ({
    action,
    data,
    file,
    filename,
    headers,
    onError,
    onProgress,
    onSuccess,
    withCredentials,
  }) => {
    const formData = new FormData();
    if (data) {
      Object.keys(data).forEach((key) => {
        formData.append(key, data[key]);
      });
    }
    formData.append('filedata', file);
    request(action, {
      withCredentials,
      headers: {
        ...headers,
        Accept: '*/*',
        'civ-site': '',
      },
      method: 'post',
      data: formData,
      ignoreSite: true,
      onUploadProgress: ({ total, loaded }) => {
        onProgress({ percent: Math.round((loaded / total) * 100).toFixed(2) }, file);
      },
    })
      .then((res) => {
        onSuccess(res, file);
      })
      .catch(onError);
    return {
      abort() {
        console.log('upload progress is aborted.');
      },
    };
  };

  render() {
    const self = this;
    const { props } = this;
    const { userInfo } = props.config;
    const site =
      props.config &&
      props.config.userInfo &&
      props.config.userInfo.site &&
      userInfo.site !== '' &&
      props.config.client !== 'oms'
        ? userInfo.site
        : '';
    // const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
    // const prefixCls = getPrefixCls();
    const uploadProps = {
      action: this.state.action,
      onStart(file) {
        console.log('onStart', file, file.name);
      },
      onSuccess(res, file) {
        if (res.success) {
          const avatarPath = '/个人信息/' + self.state.path + '/' + file.name;
          const params = {
            userID: props.config.get('userInfo.OID'),
            loginName: props.config.get('userInfo.loginName'),
            userName: props.config.get('userInfo.fullName'),
            _version: self.state.version,
            mark: props.config.get('userInfo.Mark'),
            phone: props.config.get('userInfo.Phone'),
            email: props.config.get('userInfo.Email'),
            userImage: decodeURIComponent(avatarPath),
            WXid: props.config.get('userInfo.WXid'),
          };

          appService
            .updateAvatar(params)
            .then((res) => {
              if (res.success) {
                // message.success(useIntl().formatMessage({id: 'component.avatar.update.success'}));
                message.success(globalHeader['component.avatar.update.success']);
                self.setState({
                  currentUser: {
                    name: self.state.currentUser.name,
                    avatar: `${API.AVATAR_FILE_URL}${avatarPath}`,
                    action: API.UPLOAD_FILE_URL,
                  },
                });
              }
            })
            .catch((e) => {
              message.error(useIntl().formatMessage({ id: 'component.avatar.update.fail' }));
            });
        } else {
          message.error(res.message);
        }
      },
      onError(err) {
        console.log('onError', err);
      },
      onProgress({ percent }, file) {
        console.log('onProgress', `${percent}%`, file.name);
      },
      customRequest: this.customRequest.bind(this),
      beforeUpload: this.beforeUpload.bind(this),
      onChange: this.handleChange.bind(this),
    };
    const currentUser = this.state.currentUser;
    const menuHeaderDropdown = (prefixCls) => (
      <div className={`${prefixCls}-userWrapper-userInfo`}>
        <div className={`${prefixCls}-userWrapper-userInfo-header`} style={{background:'#00b278'}}>
          <Upload
            className="avatar-uploader"
            {...uploadProps}
            maxCount={1}
            itemRender={() => <></>}
          >
            <div
              className={`${prefixCls}-userWrapper-userInfo-header-avatar`}
              style={{ backgroundImage: `url(${currentUser.avatar})` }}
            />
          </Upload>
          <div className={`${prefixCls}-userWrapper-userInfo-header-name`}>{userInfo.fullName}</div>
        </div>
        <div className={`${prefixCls}-userWrapper-userInfo-body`}>
          <div className={`${prefixCls}-userWrapper-userInfo-body-item`}>
            <ul>
              <li>
                <span />
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-label`}>
                  <FormattedMessage id="component.avatar.account" />：
                </span>
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-value`}>
                  {userInfo.loginName}
                </span>
              </li>
              <li>
                <span />
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-label`}>
                  <FormattedMessage id="component.avatar.name" />：
                </span>
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-value`}>
                  {userInfo.fullName}
                </span>
              </li>
              <li>
                <span />
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-label`}>
                  <FormattedMessage id="component.avatar.depart" />：
                </span>
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-value`}>
                  {userInfo && userInfo.depart && userInfo.depart.name}
                </span>
              </li>
              <li>
                <span />
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-label`}>
                  <FormattedMessage id="component.avatar.role" />：
                </span>
                <span className={`${prefixCls}-userWrapper-userInfo-body-item-value`}>
                  {this.getRoles()}
                </span>
              </li>
              {site ? (
                <li>
                  <span />
                  <span className={`${prefixCls}-userWrapper-userInfo-body-item-label`}>
                    <FormattedMessage id="component.siteCode" />：
                  </span>
                  <span className={`${prefixCls}-userWrapper-userInfo-body-item-value`}>
                    {userInfo.site}
                  </span>
                </li>
              ) : null}
            </ul>
          </div>
          <div className={`${prefixCls}-userWrapper-userInfo-body-exit`}>
            {userInfo && userInfo.site === '' && (
              <a onClick={(event) => this.showModal(event)}>
                <FormattedMessage id="component.password.update" />
              </a>
            )}

            <a onClick={this.loginout}>
              <FormattedMessage id="component.exit.login" />
            </a>
          </div>
        </div>
      </div>
    );

    return currentUser && currentUser.name ? (
      <GlobalContext.Consumer>
        {(value) => {
          const { getPrefixCls } = value._currentValue;
          const prefixCls = getPrefixCls();
          return (
            <>
              <Popover
                overlayClassName={`${prefixCls}-userWrapper`}
                placement="bottom"
                trigger="click"
                content={
                  props.config && props.config.userInfo ? menuHeaderDropdown(prefixCls) : null
                }
              >
                <span
                  className={`${prefixCls}-action ${prefixCls}-account`}
                  ref={(r) => (this.avatarRef = r)}
                >
                  <Avatar
                    size="small"
                    className={`${prefixCls}-account-avatar`}
                    src={currentUser.avatar}
                    alt="avatar"
                  />
                  {/* <span className={`${styles.name} anticon`}>{currentUser.name}</span> */}
                </span>
              </Popover>
              <Modal
                title="修改密码"
                centered
                width="480px"
                visible={this.state.visible}
                wrapClassName={`${prefixCls}-updatePassword`}
                cancelText="取消"
                okText="确定"
                onOk={(event) => this.handleOk(event, this.form)}
                onCancel={(event) => this.handleCancel(event, this.form)}
                zIndex={2000}
              >
                <Form labelAlign="right" {...formItemLayout} ref={(f) => (this.form = f)}>
                  {!getIOT() && (
                    <Form.Item
                      name="oldPwd"
                      label="原密码"
                      rules={[
                        {
                          required: true,
                          message: '请输入原始密码',
                        },
                      ]}
                      hasFeedback
                    >
                      <Input.Password />
                    </Form.Item>
                  )}
                  <Form.Item
                    name="newPwd"
                    label="新密码"
                    rules={[
                      {
                        required: true,
                        message: '请输入新密码',
                      },
                      {
                        pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9!@#$%^&*_]{8,16}$/,
                        message: '密码字符长度为8-16个字符',
                      },
                    ]}
                    hasFeedback
                  >
                    <Input.Password />
                  </Form.Item>
                  <Form.Item
                    name="confirmPwd"
                    label="确认密码"
                    dependencies={['newPwd']}
                    hasFeedback
                    rules={[
                      {
                        required: true,
                        message: '请输入确认密码',
                      },
                      ({ getFieldValue }) => ({
                        validator(rule, value) {
                          if (!value || getFieldValue('newPwd') === value) {
                            return Promise.resolve();
                          }
                          return Promise.reject('确认密码与新密码输入不一致');
                        },
                      }),
                    ]}
                  >
                    <Input.Password />
                  </Form.Item>
                </Form>
              </Modal>
            </>
          );
        }}
      </GlobalContext.Consumer>
    ) : (
      <GlobalContext.Consumer>
        {(value) => {
          const { getPrefixCls } = value._currentValue;
          const prefixCls = getPrefixCls();
          return (
            <span className={`${prefixCls}-action ${prefixCls}-account`}>
              <Spin
                size="small"
                style={{
                  marginLeft: 8,
                  marginRight: 8,
                }}
              />
            </span>
          );
        }}
      </GlobalContext.Consumer>
    );
  }
}

export default withRouter(AvatarDropdown);
