import { Alert, DatePicker, Form, Input, Radio, Space } from 'antd'
import moment from 'moment'

import { V1APITokenPrivilege } from 'apiClient/services/core-server/interface'
import ModalForm from 'components/ModalForm'

export type CreateAPITokenFormType = {
  name: string
  comment: string
  expire_at: moment.Moment
  privilege: V1APITokenPrivilege
}

interface CreateAPITokenFormProps {
  visible: boolean
  onSubmit: (payload: CreateAPITokenFormType) => Promise<void>
  onCancel: () => void
}

export default function CreateAPITokenForm({
  visible,
  onSubmit,
  onCancel
}: CreateAPITokenFormProps) {
  return (
    <ModalForm<CreateAPITokenFormType>
      visible={visible}
      name="createAPIToken"
      title="Generate API Token"
      width={700}
      okText="Generate"
      formLayout="vertical"
      labelAlign="left"
      layout={{
        labelCol: { span: 24 },
        wrapperCol: { span: 24 }
      }}
      onSubmit={onSubmit}
      onCancel={onCancel}
      getFields={() => (
        <div style={{ width: 520, maxWidth: '100%', margin: '0 auto' }}>
          <Form.Item
            label="Name"
            name="name"
            rules={[{ required: true, message: 'Name is required' }]}
          >
            <Input placeholder="Token name" />
          </Form.Item>
          <Form.Item
            label="Comment"
            name="comment"
            rules={[{ required: true, message: 'Comment is required' }]}
          >
            <Input placeholder="Token description" />
          </Form.Item>
          <Form.Item
            label="Expire At"
            name="expire_at"
            rules={[
              { required: true, message: 'Expire At is required' },
              {
                validator: (_, value: moment.Moment) => {
                  if (!value) {
                    return Promise.resolve()
                  }

                  const now = moment()
                  const maxExpireAt = moment().add(1, 'year')

                  if (value.isSameOrBefore(now)) {
                    return Promise.reject(
                      new Error('Expire At must be in the future')
                    )
                  }

                  if (value.isAfter(maxExpireAt)) {
                    return Promise.reject(
                      new Error('Expire At cannot exceed one year from now')
                    )
                  }

                  return Promise.resolve()
                }
              }
            ]}
          >
            <DatePicker
              showTime
              style={{ width: '100%' }}
              disabledDate={(current) => {
                if (!current) {
                  return false
                }

                const now = moment()
                const maxExpireAt = moment().add(1, 'year').endOf('day')

                return (
                  current.isBefore(now.startOf('day')) ||
                  current.isAfter(maxExpireAt)
                )
              }}
            />
          </Form.Item>
          <Form.Item
            label="Privilege"
            name="privilege"
            initialValue={V1APITokenPrivilege.API_TOKEN_PRIVILEGE_READONLY}
            rules={[{ required: true, message: 'Privilege is required' }]}
          >
            <Radio.Group>
              <Space>
                <Radio
                  value={V1APITokenPrivilege.API_TOKEN_PRIVILEGE_READWRITE}
                >
                  Read Write
                </Radio>
                <Radio value={V1APITokenPrivilege.API_TOKEN_PRIVILEGE_READONLY}>
                  Read Only
                </Radio>
              </Space>
            </Radio.Group>
          </Form.Item>
          <Form.Item>
            <Alert
              type="warning"
              showIcon
              message="Security Notice"
              description="API Token carries the privilege selected above and represents you in the system. Keep it safe and do not share it."
            />
          </Form.Item>
        </div>
      )}
    />
  )
}
