/**
 * THIS IS AN AUTO-GENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
 */
import React from 'react';
import { getLocale, FormattedMessage } from 'umi';
import BraftEditor from 'braft-editor';
import 'braft-editor/dist/index.css';
import '@intlgadmin/braft-extensions/dist/table.css';
import Table from '@intlgadmin/braft-extensions/dist/table';
import gadmin from '@/gadmin';
import editorViewCss from '!!raw-loader!@/generated/styles/braft-editor-view.css';

export type RichTextProps = {
  value: string;
  onChange: (_value: string) => void;
  extendPreviewCss?: string;
};
class RichText extends React.Component {
  constructor(props: RichTextProps) {
    super(props);

    // 解决不回显table的问题
    const blockImportFn = Table()[2].importer;
    const blockExportFn = Table()[2].exporter;
    this.state = {
      editorState: BraftEditor.createEditorState(props.value, { blockImportFn, blockExportFn }),
    };

    BraftEditor.use(
      Table({
        defaultColumns: 3, // 默认列数
        defaultRows: 3, // 默认行数
        withDropdown: true, // 插入表格前是否弹出下拉菜单
        columnResizable: true, // 是否允许拖动调整列宽，默认false
        exportAttrString: 'border="1" style="border-collapse: collapse"', // 指定输出HTML时附加到table标签上的属性字符串
        // includeEditors: ['editor-1'], // 指定该模块对哪些BraftEditor生效，不传此属性则对所有BraftEditor有效
        // excludeEditors: ['editor-id-2']  // 指定该模块对哪些BraftEditor无效
      }),
    );

    this.extendControls = [
      {
        key: 'custom-button',
        type: 'button',
        text: <FormattedMessage id="presets.preview" defaultMessage="preview" />,
        onClick: this.preview,
      },
    ];

    this.mediaOptions = {
      accepts: {
        image: 'image/png,image/jpeg,image/gif,image/webp,image/apng,image/svg',
        video: false,
        audio: false,
      },
      uploadFn: this.uploadHandler.bind(this),
    };

    this.handleChange = this.handleChange.bind(this);
  }

  static getDerivedStateFromError() {
    return null;
  }

  componentDidCatch(error) {
    console.warn(error);
    gadmin.aegis?.error(error);
  }

  preview = () => {
    if (window.previewWindow) {
      window.previewWindow.close();
    }

    window.previewWindow = window.open();
    window.previewWindow.document.write(this.buildPreviewHtml());
    window.previewWindow.document.close();
  };

  buildPreviewHtml() {
    return `
       <!Doctype html>
       <html>
         <head>
           <title>Preview Content</title>
           <style>
             html,body {
               height: 100%;
               margin: 0;
               padding: 0;
               overflow: auto;
               background-color: #f1f2f3;
             }
             .braft-editor-view {
               padding: 30px 20px;
               background-color: #fff;
               border-right: solid 1px #eee;
               border-left: solid 1px #eee;
             }
             ${editorViewCss}
             ${gadmin.extendPreviewCss || ''}
             ${this.props.extendPreviewCss || ''}
           </style>
         </head>
         <body>
           <div class="braft-editor-view">${this.state.editorState.toHTML()}</div>
         </body>
       </html>
     `;
  }

  uploadHandler(param) {
    if (!param.file) {
      return false;
    }

    const formData = new FormData();
    formData.append('file', param.file);
    gadmin
      .uploadFile(formData)
      .then((response) => {
        if (!response) {
          param.error({ msg: 'Failed to upload.' });
          return;
        }
        param.success({ url: response.data.url });
      })
      .catch(() => {
        param.error({ msg: 'Failed to upload.' });
      });
    return true;
  }

  handleChange(editorState) {
    this.setState({ editorState });
    if (editorState.isEmpty()) {
      this.props.onChange('');
    } else {
      this.props.onChange(editorState.toHTML());
    }
  }

  render() {
    const langSwitch = {
      'ja': 'jpn'
    };
    let language = getLocale().split('-')[0] || 'zh';
    if(Object.keys(langSwitch).includes(language)) {
      language = langSwitch[language];
    }
    return (
      <div style={{ border: '1px solid #d1d1d1', borderRadius: '2px' }}>
        <BraftEditor
          value={this.state.editorState}
          onChange={this.handleChange}
          extendControls={this.extendControls}
          media={this.mediaOptions}
          language={language}
          fontSizes={[12, 13, 14, 15, 16, 17, 18, 20, 24,
            28, 30, 32, 36, 40, 48,
            56, 64, 72, 96, 120, 144]}
        />
      </div>
    );
  }
}

export default RichText;
