import React from 'react';
import { Button, Form, InputNumber } from 'antd';
import { FormInstance } from 'antd/lib/form';
import { cloneDeep } from 'lodash';
import intl from 'react-intl-universal';
import { TIME_INTERVAL_OPTIONS } from '@/utils/dashboard';
import { DashboardSelect, Option } from '@/components/DashboardSelect';
import { MetricPopover } from '@/components/MetricPopover';
import { IServicePanelConfig } from '@/utils/interface';

import './index.less';

interface IProps {
  editType: string;
  editIndex: number;
  serviceMetric: any;
  panelConfig: {
    graph: IServicePanelConfig[];
    storage: IServicePanelConfig[];
    meta: IServicePanelConfig[];
  };
  onClose: () => void;
  onPanelConfigUpdate: (values) => void;
}

class ServiceCardEdit extends React.Component<IProps> {
  formRef = React.createRef<FormInstance>();

  handleUpdateMetricType = (value: string) => {
    const {
      serviceMetric = { spaces: [], graphd: [], storaged: [], metad: [] },
      editType,
    } = this.props;
    const metric = serviceMetric[`${editType}d`].filter(
      item => item.metric === value,
    )[0];
    this.formRef.current!.setFieldsValue({
      metricFunction: metric?.metricType[0].value,
      space: '',
    });
  };

  handlePanelConfigUpdate = (values: any) => {
    const { period, space, metric, metricFunction, baseLine } = values;
    const { editType, panelConfig, serviceMetric, editIndex } = this.props;
    const metricTypeList = serviceMetric[`${editType}d`].filter(
      item => item.metric === metric,
    )[0].metricType;
    const metricType = metricTypeList.filter(
      type => type.value === metricFunction,
    )[0].key;
    const _config = cloneDeep(panelConfig);
    _config[editType][editIndex] = {
      period,
      metric,
      metricFunction,
      metricType,
      baseLine,
      space,
    };
    this.props.onPanelConfigUpdate(_config);
    localStorage.setItem('panelConfig', JSON.stringify(_config));
    this.props.onClose();
  };

  render() {
    const { editIndex, editType, serviceMetric, panelConfig, onClose } =
      this.props;
    const editItem = panelConfig[editType][editIndex];
    return (
      <div className="service-card-edit">
        <Form
          ref={this.formRef}
          initialValues={editItem}
          onFinish={this.handlePanelConfigUpdate}
        >
          <Form.Item label={intl.get('service.period')} name="period">
            <DashboardSelect>
              {TIME_INTERVAL_OPTIONS.map(value => (
                <Option key={value} value={value}>
                  {value}
                </Option>
              ))}
            </DashboardSelect>
          </Form.Item>
          <MetricPopover list={serviceMetric[`${editType}d`]} />
          <Form.Item label={intl.get('service.metric')} name="metric">
            <DashboardSelect onChange={this.handleUpdateMetricType}>
              {serviceMetric[`${editType}d`].map(metric => (
                <Option key={metric.metric} value={metric.metric}>
                  {metric.metric}
                </Option>
              ))}
            </DashboardSelect>
          </Form.Item>
          <Form.Item
            noStyle={true}
            shouldUpdate={(prevValues, currentValues) =>
              prevValues.metric !== currentValues.metric
            }
          >
            {({ getFieldValue }) => {
              const metric = getFieldValue('metric');
              const isSpaceMetric = serviceMetric[`${editType}d`].filter(
                item => item.metric === metric,
              )[0]?.isSpaceMetric;
              return getFieldValue('metric') && isSpaceMetric ? (
                <Form.Item label={intl.get('service.spaces')} name="space">
                  <DashboardSelect>
                    <Option key="all" value="">
                      {intl.get('common.all')}
                    </Option>
                    {serviceMetric.spaces?.map(space => (
                      <Option key={space} value={space}>
                        {space}
                      </Option>
                    ))}
                  </DashboardSelect>
                </Form.Item>
              ) : null;
            }}
          </Form.Item>
          <Form.Item
            noStyle={true}
            shouldUpdate={(prevValues, currentValues) =>
              prevValues.metric !== currentValues.metric
            }
          >
            {({ getFieldValue }) => {
              const metric = getFieldValue('metric');
              const typeList = serviceMetric[`${editType}d`].filter(
                item => item.metric === metric,
              )[0]?.metricType;
              return getFieldValue('metric') ? (
                <Form.Item
                  label={intl.get('service.metricParams')}
                  name="metricFunction"
                >
                  <DashboardSelect>
                    {typeList?.map(params => (
                      <Option key={params.key} value={params.value}>
                        {params.key}
                      </Option>
                    ))}
                  </DashboardSelect>
                </Form.Item>
              ) : null;
            }}
          </Form.Item>
          <Form.Item label={intl.get('common.baseLine')} name="baseLine">
            <InputNumber min={0} />
          </Form.Item>
          <div className="footer-btns">
            <Button htmlType="button" onClick={onClose}>
              {intl.get('common.cancel')}
            </Button>
            <Button
              data-track-category="service_card"
              data-track-action="confirm_edit"
              data-track-label={`from_${editType}`}
              type="primary"
              htmlType="submit"
            >
              {intl.get('common.confirm')}
            </Button>
          </div>
        </Form>
      </div>
    );
  }
}

export default ServiceCardEdit;