import * as React from 'react';
import { observer } from 'mobx-react';
import { Tabs, PageHeader, Button, notification, Popconfirm, Spin } from 'antd';
import { handleTabKey } from 'lib/utils';
import { EassentialInfo } from './essential-info';
import { TaskStatusDetails } from './taskStatus-details';
import { ITasksMetaData, ITrigger } from 'types/base-type';
import { triggerClusterTask } from 'lib/api';
import { handlePageBack } from 'lib/utils';
import { admin } from 'store/admin';
import Url from 'lib/url-parser';
import './index.less';

const { TabPane } = Tabs;
let showStatus: boolean = false;
let showContinue: boolean = false;

@observer
export class OperationDetail extends React.Component {
  public taskId: number;
  public taskName: string;

  public state = {
    showContinue: false,
  };

  constructor(props: any) {
    super(props);
    const url = Url();
    this.taskId = Number(url.search.taskId);
  }

  public bindClick() {
    const type = showContinue ? 'start' : 'pause';
    const params = {
      taskId: this.taskId,
      action: type,
      hostname: '',
    } as ITrigger;
    triggerClusterTask(params).then(data => {
      admin.getSubtasksStatus(this.taskId);
      notification.success({ message: `${showContinue ? '继续部署' : '暂停'}成功!` });
    });
  }

  public callBackOrCancel(type: string) {
    const params = {
      taskId: this.taskId,
      action: type,
      hostname: '',
    } as ITrigger;
    triggerClusterTask(params).then(data => {
      admin.getSubtasksStatus(this.taskId);
      notification.success({ message: `${type === 'rollback' ? '回滚任务' : '取消'}成功` });
    });
  }
  public handleVal(value: number) {
    showStatus = (value + '').includes('100') ? true : false;
  }

  public componentDidMount() {
    admin.getTasksMetadata(this.taskId);
    admin.getSubtasksStatus(this.taskId);
  }

  public render() {
    // 任务状态: 30:运行中(展示暂停), 40:暂停(展示开始), 100:完成(都置灰)
    showStatus = admin.taskStatusDetails && admin.taskStatusDetails.status === 100 ? true : false;
    showContinue = admin.taskStatusDetails && admin.taskStatusDetails.status === 40 ? true : false;
    const showRollBack = admin.taskStatusDetails && admin.taskStatusDetails.rollback;
    let tasks = {} as ITasksMetaData;
    tasks = admin.tasksMetaData ? admin.tasksMetaData : tasks;
    return (
      <>
      <Spin spinning={admin.loading}>
      <PageHeader
        className="detail hotspot-header"
        onBack={() => handlePageBack('/admin/operation#1')}
        title={`任务名称${tasks.taskName ? '/' + tasks.taskName : ''}`}
        extra={[
          <Button key="1" type="primary" disabled={showStatus} >
            <Popconfirm
              title={`确定${showContinue ? '开始' : '暂停'}?`}
              onConfirm={() => this.bindClick()}
              cancelText="取消"
              okText="确认"
            >
              <a>{showContinue ? '开始' : '暂停'}</a>
            </Popconfirm>
          </Button>,
          <Button
            key="2"
            type="primary"
            disabled={showRollBack || showStatus}
          >
            <Popconfirm
              title={`确定回滚?`}
              onConfirm={() => this.callBackOrCancel('rollback')}
              cancelText="取消"
              okText="确认"
            >
              <a>回滚</a>
            </Popconfirm>
          </Button>,
          <Button
            key="3"
            type="primary"
            disabled={showStatus}
          >
            <Popconfirm
              title={`确定回滚?`}
              onConfirm={() => this.callBackOrCancel('cancel')}
              cancelText="取消"
              okText="确认"
            >
              <a>取消</a>
            </Popconfirm>
          </Button>,
        ]}
      >
      <Tabs activeKey={location.hash.substr(1) || '1'} type="card" onChange={handleTabKey}>
        <TabPane tab="基本信息" key="1">
          <EassentialInfo tasksMetaData={tasks} />
        </TabPane>
        <TabPane tab="任务状态详情" key="2">
          <TaskStatusDetails handleVal={(value: number) => this.handleVal(value)} />
        </TabPane>
      </Tabs>
      </PageHeader>
      </Spin>
      </>
    );
  }
}