import React from 'react';
import { Breadcrumb, Tooltip, Switch } from 'antd';
import './index.less';
import Page from '@src/containers/Page';
import { asyncConfirm, asyncSMessage } from '@src/services/AsyncTools';
import { formatPercent, formatDate } from '@src/services/Tools';
import { RestartConfirmModal } from '../../../components/OtherModal';
import ListTable from '../../../components/ListTable';
import ProgressText from '../../../components/ProgressText';
import IconButton from '../../../components/IconButton';
import Button from '../../../components/Button';
import { Main } from '../../../stores/main';
import { Question } from '../../../stores/question';

export default class extends Page {
  initState() {
    this.qxCatColumns = [
      {
        title: '模考',
        width: 210,
        align: 'left',
        render: record => {
          let progress = 0;
          if (record.report) {
            progress = formatPercent(record.report.userNumber, record.report.questionNumber);
          }
          return [
            <div className="table-row" style={{ paddingRight: 40 }}>
              <div className="night f-s-16">
                {record.title}
                {record.paper && record.paper.paperNo > 0 ? String.fromCharCode(64 + record.paper.paperNo) : ''}
              </div>
              <div>
                <ProgressText progress={progress} size="small" />
              </div>
            </div>,
            this.state.showPrev && record.prevReport && (
              <div className="table-row prev t-3">
                <div className="night f-s-16">
                  {record.title}
                  {record.prevPaper && record.prevPaper.paperNo > 0
                    ? String.fromCharCode(64 + record.prevPaper.paperNo)
                    : ''}
                </div>
              </div>
            ),
          ];
        },
      },
      {
        title: 'Total',
        width: 110,
        align: 'left',
        render: record => {
          return [
            <div className="table-row">
              <div className="night f-s-16 f-w-b">
                {record.report ? `${record.report.score.totalScore}分${record.report.score.totalRank}th` : '-分-th'}
              </div>
              <div className="f-s-12">全站: {Math.round(record.totalScore / record.totalTimes)}分</div>
            </div>,
            this.state.showPrev && record.prevReport && (
              <div className="table-row prev t-3">
                <div className="night f-s-16 f-w-b">
                  {record.prevReport.score.totalScore}分{record.prevReport.score.totalRank}th
                </div>
                <div className="f-s-12">全站: {Math.round(record.secondTotalScore / record.secondTotalTimes)}分</div>
              </div>
            ),
          ];
        },
      },
      {
        title: 'Verbal',
        width: 110,
        align: 'left',
        render: record => {
          return [
            <div className="table-row">
              <div className="night f-s-16 f-w-b">
                {record.report ? `${record.report.score.verbalScore}分${record.report.score.verbalRank}th` : '-分-th'}
              </div>
              <div className="f-s-12">全站: {Math.round(record.verbalScore / record.totalTimes)}分</div>
            </div>,
            this.state.showPrev && record.prevReport && (
              <div className="table-row prev t-3">
                <div className="night f-s-16 f-w-b">
                  {record.prevReport.score.verbalScore}分{record.prevReport.score.verbalRank}th
                </div>
                <div className="f-s-12">全站: {Math.round(record.secondVerbalScore / record.secondTotalTimes)}分</div>
              </div>
            ),
          ];
        },
      },
      {
        title: 'Quant',
        width: 110,
        align: 'left',
        render: record => {
          return [<div className="table-row">
            <div className="night f-s-16 f-w-b">
              {record.report ? `${record.report.score.quantScore}分${record.report.score.quantRank}th` : '-分-th'}
            </div>
            <div className="f-s-12">全站: {Math.round(record.quantScore / record.totalTimes)}分</div>
          </div>,
          this.state.showPrev && record.prevReport && (
            <div className="table-row prev t-3">
              <div className="night f-s-16 f-w-b">
                {record.prevReport.score.quantScore}分{record.prevReport.score.quantRank}th
              </div>
              <div className="f-s-12">全站: {Math.round(record.secondQuantScore / record.secondTotalTimes)}分</div>
            </div>
          ),
          ];
        },
      },
      {
        title: 'IR',
        width: 110,
        align: 'left',
        render: record => {
          return [<div className="table-row">
            <div className="night f-s-16 f-w-b">
              {record.report ? `${record.report.score.irScore}分${record.report.score.irRank}th` : '-分-th'}
            </div>
            <div className="f-s-12">全站: {Math.round(record.irScore / record.totalTimes)}分</div>
          </div>,
          this.state.showPrev && record.prevReport && (
            <div className="table-row prev t-3">
              <div className="night f-s-16 f-w-b">
                {record.prevReport.score.irScore}分{record.prevReport.score.irRank}th
              </div>
              <div className="f-s-12">全站: {Math.round(record.secondIrScore / record.secondTotalTimes)}分</div>
            </div>
          ),
          ];
        },
      },
      {
        title: '做题时间',
        width: 100,
        align: 'left',
        render: record => {
          return [<div className="table-row">
            <div>{record.report && formatDate(record.report.updateTime, 'YYYY-MM-DD')}</div>
            <div>{record.report && formatDate(record.report.updateTime, 'HH:mm')}</div>
          </div>,
          this.state.showPrev && record.prevReport && (
            <div className="table-row prev t-3">
              <div>{formatDate(record.prevReport.updateTime, 'YYYY-MM-DD')}</div>
              <div>{formatDate(record.prevReport.updateTime, 'HH:mm')}</div>
            </div>
          ),
          ];
        },
      },
      {
        title: '操作',
        width: 110,
        align: 'left',
        render: record => {
          return [<div className="table-row p-t-1">
            {!record.report && (
              <IconButton
                className="m-r-5"
                type="start"
                tip="Start"
                onClick={() => {
                  Question.startLink('examination', record);
                }}
              />
            )}
            {record.report && !record.report.isFinish && (
              <IconButton
                type="continue"
                tip="Continue"
                onClick={() => {
                  Question.continueLink('examination', record);
                }}
              />
            )}
          </div>,
          this.state.showPrev && record.prevReport && (
            <div className="table-row prev" />
          ),
          ];
        },
      },
      {
        title: '报告',
        width: 50,
        align: 'right',
        render: record => {
          return [<div className="table-row p-t-1">
            {record.report && record.report.isFinish && (
              <IconButton
                className="m-r-5"
                type="report"
                tip="Report"
                onClick={() => {
                  Question.reportLink(record);
                }}
              />
            )}
          </div>,
          this.state.showPrev && (
            <div className="prev">
              {record.prevReport && (
                <IconButton
                  type="report"
                  tip="Report"
                  onClick={() => {
                    Question.reportPrevLink(record);
                  }}
                />
              )}
            </div>
          ),
          ];
        },
      },
    ];
    this.catColumns = [
      {
        title: '模考',
        width: 210,
        align: 'left',
        render: record => {
          let progress = 0;
          if (record.report) {
            progress = formatPercent(record.report.userNumber, record.report.questionNumber);
          }
          return (
            <div className="table-row">
              <div className="night f-s-16">
                {record.title}
                {record.paper && record.paper.paperNo > 0 ? String.fromCharCode(64 + record.paper.paperNo) : ''}
              </div>
              <div>
                <ProgressText progress={progress} size="small" />
              </div>
            </div>
          );
        },
      },
      {
        title: 'Total',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="night f-s-16 f-w-b">
                {record.report ? `${record.report.score.totalScore}分${record.report.score.totalRank}th` : '-分-th'}
              </div>
              <div className="f-s-12">全站: {Math.round(record.totalScore / record.totalTimes)}分</div>
            </div>
          );
        },
      },
      {
        title: 'Verbal',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="night f-s-16 f-w-b">
                {record.report ? `${record.report.score.verbalScore}分${record.report.score.verbalRank}th` : '-分-th'}
              </div>
              <div className="f-s-12">全站: {Math.round(record.verbalScore / record.totalTimes)}分</div>
            </div>
          );
        },
      },
      {
        title: 'Quant',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="night f-s-16 f-w-b">
                {record.report ? `${record.report.score.quantScore}分${record.report.score.quantRank}th` : '-分-th'}
              </div>
              <div className="f-s-12">全站: {Math.round(record.quantScore / record.totalTimes)}分</div>
            </div>
          );
        },
      },
      {
        title: 'IR',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="night f-s-16 f-w-b">
                {record.report ? `${record.report.score.irScore}分${record.report.score.irRank}th` : '-分-th'}
              </div>
              <div className="f-s-12">全站: {Math.round(record.irScore / record.totalTimes)}分</div>
            </div>
          );
        },
      },
      {
        title: '做题时间',
        width: 100,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div>{record.report && formatDate(record.report.updateTime, 'YYYY-MM-DD')}</div>
              <div>{record.report && formatDate(record.report.updateTime, 'HH:mm')}</div>
            </div>
          );
        },
      },
      {
        title: '操作',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row p-t-1">
              {!record.report && (
                <IconButton
                  type="start"
                  tip="Start"
                  onClick={() => {
                    Question.startLink('examination', record);
                  }}
                />
              )}
              {record.report && !record.report.isFinish && (
                <IconButton
                  className="m-r-2"
                  type="continue"
                  tip="Continue"
                  onClick={() => {
                    Question.continueLink('examination', record);
                  }}
                />
              )}
              <IconButton
                type="restart"
                tip="Restart"
                onClick={() => {
                  this.restart(record);
                }}
              />
            </div>
          );
        },
      },
      {
        title: '报告',
        width: 50,
        align: 'right',
        render: record => {
          return (
            <div className="table-row p-t-1">
              {record.report && record.report.isFinish && (
                <IconButton
                  type="report"
                  tip="Report"
                  onClick={() => {
                    Question.reportLink(record);
                  }}
                />
              )}
              {this.state.showPrev && (
                <div className="prev">
                  {record.prevReport && (
                    <IconButton
                      type="report"
                      tip="Report"
                      onClick={() => {
                        Question.reportPrevLink(record);
                      }}
                    />
                  )}
                </div>
              )}
            </div>
          );
        },
      },
    ];
    this.columns = [
      {
        title: '模考',
        width: 210,
        align: 'left',
        render: record => {
          let progress = 0;
          if (record.report) {
            progress = formatPercent(record.report.userNumber, record.report.questionNumber);
          }
          return (
            <div className="table-row">
              <div className="night f-s-16">{record.title}</div>
              <div>
                <ProgressText progress={progress} times={record.paper ? record.paper.times : 0} size="small" />
              </div>
            </div>
          );
        },
      },
      {
        title: 'Total',
        width: 110,
        align: 'left',
        render: () => {
          return (
            <div className="table-row">
              <div className="f-s-12">仅CAT模考<br />提供分数</div>
            </div>
          );
        },
      },
      {
        title: 'Verbal',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="f-s-12">
                {record.report
                  ? formatPercent(record.report.setting.number.verbal, this.nums.verbal.number, false)
                  : '0%'}
              </div>
            </div>
          );
        },
      },
      {
        title: 'Quant',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="f-s-12">
                {record.report
                  ? formatPercent(record.report.setting.number.quant, this.nums.quant.number, false)
                  : '0%'}
              </div>
            </div>
          );
        },
      },
      {
        title: 'IR',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row">
              <div className="f-s-12">
                {record.report ? formatPercent(record.report.setting.number.ir, this.nums.ir.number, false) : '0%'}
              </div>
            </div>
          );
        },
      },
      {
        title: '做题时间',
        width: 100,
        align: 'left',
        render: record => {
          if (!record.report) return null;
          return (
            <div className="table-row">
              <div>{formatDate(record.report.updateTime, 'YYYY-MM-DD')}</div>
              <div>{formatDate(record.report.updateTime, 'HH:mm')}</div>
            </div>
          );
        },
      },
      {
        title: '操作',
        width: 110,
        align: 'left',
        render: record => {
          return (
            <div className="table-row p-t-1">
              {!record.report && (
                <IconButton
                  type="start"
                  tip="Start"
                  onClick={() => {
                    Question.startLink('examination', record);
                  }}
                />
              )}
              {record.report && !record.report.isFinish && (
                <IconButton
                  className="m-r-2"
                  type="continue"
                  tip="Continue"
                  onClick={() => {
                    Question.continueLink('examination', record);
                  }}
                />
              )}
              <IconButton
                type="restart"
                tip="Restart"
                onClick={() => {
                  this.restart(record);
                }}
              />
            </div>
          );
        },
      },
      {
        title: '报告',
        width: 50,
        align: 'right',
        render: record => {
          if (!record.report || !record.report.isFinish) return null;
          return (
            <div className="table-row p-t-1">
              <IconButton
                type="report"
                tip="Report"
                onClick={() => {
                  Question.reportLink(record);
                }}
              />
            </div>
          );
        },
      },
    ];
    this.inited = false;
    return {};
  }

  init() {
    const { id } = this.params;
    Main.getExaminationParent(id).then(result => {
      const navs = result.map(row => {
        row.title = `${row.titleZh}${row.titleEn}`;
        return row;
      });
      this.cat = navs.filter(row => row.isAdapt > 0).length > 0;
      this.qxCat = navs.filter(row => row.isAdapt > 1).length > 0;
      Main.getExaminationNumber().then(nums => {
        this.nums = nums;
        this.inited = true;
        this.setState({ navs });
        this.refreshData();
      });
    });
  }

  initData() {
    const data = Object.assign(this.state, this.state.search);
    this.setState(data);
    if (this.inited) this.refreshData();
  }

  refreshData() {
    if (this.cat) {
      Question.getExaminationInfo().then(result => {
        this.setState({ examination: result });
      });
    }
    this.refreshExamination();
  }

  refreshExamination() {
    Question.getExaminationList(Object.assign({ structId: this.params.id }, this.state.search))
      .then(result => {
        this.setState({ list: result.list, total: result.total });
      })
      .catch(err => {
        asyncSMessage(err.message, 'warn');
        // linkTo('/examination');
      });
  }

  restart(item) {
    asyncConfirm('提示', '是否重置', () => {
      Question.restart(item.paper.id).then(() => {
        this.refresh();
      });
    });
  }

  resetCat() {
    Question.resetCat().then(() => {
      this.refresh();
    });
  }

  renderView() {
    const { list, navs, search, examination = {}, reset } = this.state;
    const { finish } = search;
    return (
      <div>
        <div className="content">
          <Breadcrumb separator=">">
            <Breadcrumb.Item href="/examination">模考</Breadcrumb.Item>
            {(navs || []).map(row => {
              return <Breadcrumb.Item>{row.title}</Breadcrumb.Item>;
            })}
          </Breadcrumb>
          <ListTable
            rightAction={
              <div hidden={!this.qxCat}>
                <span>有效期至:{examination.expireTime && formatDate(examination.expireTime, 'YYYY-MM-DD')}</span>
                {examination.reset && (
                  <span>
                    第一遍模考成绩
                    <Switch
                      checked={this.state.showPrev}
                      onChange={() => {
                        this.setState({ showPrev: !this.state.showPrev });
                      }}
                    />
                  </span>
                )}
                {!examination.reset && examination.canReset && (
                  <Button
                    size="small"
                    radius
                    onClick={() => {
                      this.setState({ reset: true });
                    }}
                  >
                    Reset
                  </Button>
                )}
                {!examination.reset && !examination.canReset && (
                  <Tooltip overlayClassName="gray" placement="top" title="全部模考做完才可重置">
                    <a>
                      <Button size="small" disabled radius>
                        Reset
                      </Button>
                    </a>
                  </Tooltip>
                )}
              </div>
            }
            filters={[
              {
                type: 'radio',
                checked: finish,
                list: [{ key: '0', title: '未完成' }, { key: '1', title: '已完成' }],
                onChange: item => {
                  if (item.key === finish) {
                    this.search({ finish: null });
                  } else if (item.key === '0') {
                    this.search({ finish: 0 });
                  } else if (item.key === '1') {
                    this.search({ finish: 1 });
                  } else {
                    this.search({ finish: null });
                  }
                },
              },
            ]}
            data={list}
            columns={this.qxCatColumns}
          />
        </div>

        <RestartConfirmModal show={reset} onConfirm={() => this.resetCat()} onCancel={() => this.setState({ reset: false })} />
      </div>
    );
  }
}