import React from 'react';
import { Form, Button, Row, Col, Icon, Input, InputNumber, Upload } from 'antd';
import './index.less';
import Editor from '@src/components/Editor';
import Page from '@src/containers/Page';
import Block from '@src/components/Block';
import Radio from '@src/components/Radio';
import TreeSelect from '@src/components/TreeSelect';
// import EditTableCell from '@src/components/EditTableCell';
// import ActionLayout from '@src/layouts/ActionLayout';
// import TableLayout from '@src/layouts/TableLayout';
import { formatFormError, formatTreeData, getMap } from '@src/services/Tools';
import { asyncSMessage } from '@src/services/AsyncTools';
import { SwitchSelect, DataType } from '../../../../Constant';
// import { User } from '../../../stores/user';
import { Exercise } from '../../../stores/exercise';
import { Course } from '../../../stores/course';
import { System } from '../../../stores/system';

export default class extends Page {
  init() {
    this.exerciseMap = {};
    Exercise.dataStruct().then((result) => {
      const list = result.map(row => { row.title = `${row.titleZh}`; row.value = row.id; return row; });
      const tree = formatTreeData(list, 'id', 'title', 'parentId');
      this.exerciseMap = getMap(result.map(row => {
        row.title = `${row.titleZh}`;
        row.value = row.id;
        return row;
      }), 'id');

      this.setState({ exercise: tree });
    });
  }

  initData() {
    const { id } = this.params;
    let handler;
    if (id) {
      handler = Course.getData({ id });
    } else {
      handler = Promise.resolve({ structId: 0 });
    }
    handler
      .then(result => {
        const { setFieldsValue } = this.props.form;
        result.structId = `${result.structId || ' '}`;
        setFieldsValue(result);
        this.setState({ data: result });
      });
  }

  submit() {
    const { form } = this.props;
    form.validateFields((err, values) => {
      console.log(values);
      if (!err) {
        const data = form.getFieldsValue();
        data.parentStructId = this.exerciseMap[data.structId] ? this.exerciseMap[data.structId].parentId : 0;
        data.isSentence = this.exerciseMap[data.structId] ? (this.exerciseMap[data.structId].extend === 'sentence' ? 1 : 0) : 0;
        Course.editData(data).then(() => {
          asyncSMessage('保存成功');
        }).catch((e) => {
          if (e.result) form.setFields(formatFormError(data, e.result));
        });
      }
    });
  }

  renderBase() {
    const { exercise, data } = this.state;
    const { getFieldDecorator } = this.props.form;
    return <Block>
      <h1>基本信息</h1>
      <Form>
        {getFieldDecorator('id')(<input hidden />)}
        {exercise && data.structId && <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='学科'>
          {getFieldDecorator('structId', {
            rules: [{
              required: true, message: '请选择学科',
            }],
            initialValue: data.structId,
          })(
            <TreeSelect treeData={exercise} />,
          )}
        </Form.Item>}
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='资料形式'>
          {getFieldDecorator('dataType', {
            rules: [{
              required: true, message: '请选择类型',
            }],
          })(
            <Radio select={DataType} />,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='适合新手'>
          {getFieldDecorator('isNovice', {
            rules: [{
              required: true, message: '请选择',
            }],
          })(
            <Radio select={SwitchSelect} />,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='原创资料'>
          {getFieldDecorator('isOriginal', {
            rules: [{
              required: true, message: '请选择',
            }],
          })(
            <Radio select={SwitchSelect} />,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='资料名称'>
          {getFieldDecorator('title', {
            rules: [{
              required: true, message: '请输入名称',
            }],
          })(
            <Input placeholder='请输入' />,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='价格'>
          {getFieldDecorator('price', {
            rules: [{
              required: true, message: '请输入价格',
            }],
          })(
            <InputNumber placeholder='请输入' />,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='页数'>
          {getFieldDecorator('pages', {
            rules: [{
              required: true, message: '请输入页数',
            }],
          })(
            <InputNumber placeholder='请输入' />,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='链接地址'>
          {getFieldDecorator('link', {
            rules: [{
              required: true, message: '请输入地址',
            }],
          })(
            <Input placeholder='请输入' />,
          )}
        </Form.Item>
      </Form>
    </Block>;
  }

  renderInfo() {
    const { getFieldDecorator, setFieldsValue, getFieldValue } = this.props.form;
    const cover = getFieldValue('cover');
    return <Block>
      <h1>宣传信息</h1>
      <Form>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='资料封面'>
          {getFieldDecorator('cover', {
            rules: [
              { required: true, message: '上传图片' },
            ],
          })(
            <Upload
              listType="picture-card"
              showUploadList={false}
              beforeUpload={(file) => System.uploadImage(file).then((result) => {
                setFieldsValue({ cover: result.url });
                return Promise.reject();
              })}
            >
              {cover ? <img src={cover} alt="avatar" /> : <div>
                <Icon type={this.state.loading ? 'loading' : 'plus'} />
                <div className="ant-upload-text">Upload</div>
              </div>}
            </Upload>,
          )}
        </Form.Item>
        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='摘要介绍'>
          {getFieldDecorator('description', {
            rules: [{
              required: true, message: '请输入摘要',
            }],
          })(
            <Input placeholder='请输入' />,
          )}
        </Form.Item>
        {/* <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='试用页码'>
          <Row>
            <Col span={3}>
              <Form.Item>
                {getFieldDecorator('trailStart')(
                  <InputNumber min={1} precision={0} formatter={(v) => parseInt(v, 10) || 1} />,
                )}
              </Form.Item>
            </Col>
            <Col span={1}>至</Col>
            <Col span={3}>
              <Form.Item>
                {getFieldDecorator('trailEnd')(
                  <InputNumber min={1} precision={0} formatter={(v) => parseInt(v, 10) || 1} />,
                )}
              </Form.Item>
            </Col>
          </Row>
        </Form.Item> */}
      </Form>
    </Block>;
  }

  renderFile() {
    const { getFieldDecorator, setFieldsValue, getFieldValue } = this.props.form;
    const resource = getFieldValue('resource');
    const trailResource = getFieldValue('trailResource');
    return <Block>
      <h1>资料文件</h1>
      <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='正式版本'>
        {resource && <a href={resource} target="_blank">访问</a>}
        {getFieldDecorator('resource', {
          rules: [
            { required: true, message: '上传文件' },
          ],
        })(
          <Upload
            showUploadList={false}
            beforeUpload={(file) => System.uploadImage(file).then((result) => {
              setFieldsValue({ resource: result.url });
              return Promise.reject();
            })}
          >
            <Button>上传文件</Button>
          </Upload>,
        )}
      </Form.Item>
      <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='试用版本'>
        {trailResource && <a href={trailResource} target="_blank">访问</a>}
        {getFieldDecorator('trailResource', {
          rules: [
            { required: true, message: '上传文件' },
          ],
        })(
          <Upload
            showUploadList={false}
            beforeUpload={(file) => System.uploadImage(file).then((result) => {
              setFieldsValue({ trailResource: result.url });
              return Promise.reject();
            })}
          >
            <Button>上传文件</Button>
          </Upload>,
        )}
      </Form.Item>
    </Block>;
  }

  renderContent() {
    const { getFieldDecorator } = this.props.form;
    return <Block flex>
      <Form>
        <Form.Item label='资料介绍'>
          {getFieldDecorator('content', {
          })(
            <Editor placeholder='输入内容' />,
          )}
        </Form.Item>
      </Form>
    </Block>;
  }

  renderAuthor() {
    const { getFieldDecorator } = this.props.form;
    return <Block flex>
      <Form>
        <Form.Item label='作者介绍'>
          {getFieldDecorator('authorContent', {
          })(
            <Editor placeholder='输入内容' />,
          )}
        </Form.Item>
      </Form>
    </Block>;
  }

  renderMethod() {
    const { getFieldDecorator } = this.props.form;
    return <Block flex>
      <Form>
        <Form.Item label='获取方式'>
          {getFieldDecorator('methodContent', {
          })(
            <Editor placeholder='输入内容' />,
          )}
        </Form.Item>
      </Form>
    </Block>;
  }

  renderView() {
    return <div flex>
      {this.renderBase()}
      {this.renderInfo()}
      {this.renderFile()}
      {this.renderContent()}
      {this.renderAuthor()}
      {this.renderMethod()}

      <Row type="flex" justify="center">
        <Col>
          <Button type="primary" onClick={() => {
            this.submit();
          }}>保存</Button>
        </Col>
      </Row>
    </div>;
  }
}