/*
	* Licensed to the Apache Software Foundation (ASF) under one or more
	* contributor license agreements. See the NOTICE file distributed with
	* this work for additional information regarding copyright ownership.
	* The ASF licenses this file to You under the Apache License, Version 2.0
	* (the "License"); you may not use this file except in compliance with
	* the License. You may obtain a copy of the License at
	*
	* http://www.apache.org/licenses/LICENSE-2.0
	*
	* Unless required by applicable law or agreed to in writing, software
	* distributed under the License is distributed on an "AS IS" BASIS,
	* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	* See the License for the specific language governing permissions and
	* limitations under the License.
	*/

/* eslint-disable no-unused-expressions */
/* eslint-disable radix */
import { Modal, Form, Input, Select, message,Radio } from "antd";
import React, { Component } from "react";
import PropTypes from "prop-types";
import { Method } from "./globalData";
import { getIntlContent } from "../../../utils/IntlUtils";
import { addApi, updateApi } from "../../../services/api";

const RPCTYPE = [
  "http",
  "dubbo",
  "sofa",
  "tars",
  "websocket",
  "springCloud",
  "motan",
  "grpc"
];

const API_SOURCE_TYPE = [
  "swagger",
  "annotation generation",
  "create manuallym",
  "import swagger",
  "import yapi"
];
const STATE_TYPE = [
  "unpublished",
  "published",
  "offline"
];

class AddAndUpdateApiDoc extends Component {
  static defaultProps = {
    form: PropTypes.object,
    visible: PropTypes.bool,
    formLoaded: PropTypes.func,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
  };

  componentDidMount() {
    const { form, formLoaded } = this.props;
    formLoaded?.(form);
  }

  handleSubmit = () => {
    const { form, onOk } = this.props;
    form.validateFieldsAndScroll(async (err, values) => {
      if (!err) {
        const { id } = values;
        let res = {};
        values.state = parseInt(values.state);
        values.apiSource = parseInt(values.apiSource);
        values.httpMethod = parseInt(values.httpMethod);
        if (!id) {
          res = await addApi({
            ...values
          });
        } else {
          res = await updateApi({
            ...values
          });
        }

        if (res.code !== 200) {
          message.error(res.message);
        } else {
          message.success(res.message);
          onOk?.(values);
        }
      }
    });
  };

  render() {
    const {
      onCancel,
      form,
      contextPath = "",
      apiPath = "",
      httpMethod = "",
      consume = "",
      produce = "",
      version = "",
      rpcType = "",
      state = "",
      ext = "",
      apiOwner = "",
      apiDesc = "",
      apiSource = "",
      document = "",
      visible = false
    } = this.props;
    const { getFieldDecorator } = form;
    const formItemLayout = {
      labelCol: {
        sm: { span: 5 }
      },
      wrapperCol: {
        sm: { span: 19 }
      }
    };

    return (
      <Modal
        visible={visible}
        onCancel={onCancel}
        onOk={this.handleSubmit}
        closable={false}
        forceRender
      >
        <Form className="login-form">
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.CONTEXTPATH")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("contextPath", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.CONTEXTPATH")
                }
              ],
              initialValue: contextPath
            })(
              <Input
                placeholder={getIntlContent(
                  "SHENYU.DOCUMENT.APIDOC.CONTEXTPATH"
                )}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.APIPATH")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("apiPath", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.APIPATH")
                }
              ],
              initialValue: apiPath
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.APIPATH")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.HTTPMETHOD")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("httpMethod", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.HTTPMETHOD")
                }
              ],
              initialValue: httpMethod
            })(
              <Select>
                {Object.values(Method).map((e, i) => {
                  return (
                    <Select.Option key={`${e} ${i}`} value={i}>
                      {e}
                    </Select.Option>
                  );
                })}
              </Select>
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.CONSUME")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("consume", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.CONSUME")
                }
              ],
              initialValue: consume
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.CONSUME")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.PRODUCE")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("produce", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.PRODUCE")
                }
              ],
              initialValue: produce
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.PRODUCE")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.VERSION")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("version", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.VERSION")
                }
              ],
              initialValue: version
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.VERSION")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.RPCTYPE")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("rpcType", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.RPCTYPE")
                }
              ],
              initialValue: rpcType
            })(
              <Select>
                {RPCTYPE.map((e, i) => {
                  return (
                    <Select.Option key={`${e} ${i}`} value={e}>
                      {e}
                    </Select.Option>
                  );
                })}
              </Select>
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.STATE")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("state", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.STATE")
                }
              ],
              initialValue: state
            })(
              <Radio.Group buttonStyle="solid">
                {STATE_TYPE.map((e, i) => {
                  return (
                    <Radio.Button key={`${e} ${i}`} value={i}>
                      {e}
                    </Radio.Button>
                  );
                })}
               
              </Radio.Group>
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.EXT")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("ext", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.EXT")
                }
              ],
              initialValue: ext
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.EXT")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.APIOWNER")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("apiOwner", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.APIOWNER")
                }
              ],
              initialValue: apiOwner
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.APIOWNER")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.APIDESC")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("apiDesc", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.APIDESC")
                }
              ],
              initialValue: apiDesc
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.APIDESC")}
              />
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.APISOURCE")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("apiSource", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.APISOURCE")
                }
              ],
              initialValue: apiSource
            })(
              <Select>
                {API_SOURCE_TYPE.map((e, i) => {
                  return (
                    <Select.Option key={`${e} ${i}`} value={i}>
                      {e}
                    </Select.Option>
                  );
                })}
              </Select>
            )}
          </Form.Item>
          <Form.Item
            label={`${getIntlContent("SHENYU.DOCUMENT.APIDOC.DOCUMENT")}`}
            {...formItemLayout}
          >
            {getFieldDecorator("document", {
              rules: [
                {
                  required: true,
                  message: getIntlContent("SHENYU.DOCUMENT.APIDOC.DOCUMENT")
                }
              ],
              initialValue: document
            })(
              <Input
                placeholder={getIntlContent("SHENYU.DOCUMENT.APIDOC.DOCUMENT")}
              />
            )}
          </Form.Item>

          <Form.Item hidden>{getFieldDecorator("tagIds")(<Input />)}</Form.Item>

          <Form.Item hidden>{getFieldDecorator("id")(<Input />)}</Form.Item>
        </Form>
      </Modal>
    );
  }
}

export default Form.create()(AddAndUpdateApiDoc);
