import {Component} from 'react';
import {browserHistory} from 'react-router';

import ApiForm from 'sentry/components/forms/apiForm';
import MultipleCheckbox from 'sentry/components/forms/controls/multipleCheckbox';
import BooleanField from 'sentry/components/forms/fields/booleanField';
import TextField from 'sentry/components/forms/fields/textField';
import FormField from 'sentry/components/forms/formField';
import {Panel, PanelBody, PanelHeader} from 'sentry/components/panels';
import {t} from 'sentry/locale';
import {Organization, ServiceHook} from 'sentry/types';
import {normalizeUrl} from 'sentry/utils/withDomainRequired';

const EVENT_CHOICES = ['event.alert', 'event.created'];

type Props = {
  initialData: Partial<ServiceHook> & {isActive: boolean};
  organization: Organization;
  projectId: string;
  hookId?: string;
};

export default class ServiceHookSettingsForm extends Component<Props> {
  onSubmitSuccess = () => {
    const {organization, projectId} = this.props;
    browserHistory.push(
      normalizeUrl(`/settings/${organization.slug}/projects/${projectId}/hooks/`)
    );
  };

  render() {
    const {initialData, organization, projectId, hookId} = this.props;

    const endpoint = hookId
      ? `/projects/${organization.slug}/${projectId}/hooks/${hookId}/`
      : `/projects/${organization.slug}/${projectId}/hooks/`;

    return (
      <Panel>
        <ApiForm
          apiMethod={hookId ? 'PUT' : 'POST'}
          apiEndpoint={endpoint}
          initialData={initialData}
          onSubmitSuccess={this.onSubmitSuccess}
          footerStyle={{
            marginTop: 0,
            paddingRight: 20,
          }}
          submitLabel={hookId ? t('Save Changes') : t('Create Hook')}
        >
          <PanelHeader>{t('Hook Configuration')}</PanelHeader>
          <PanelBody>
            <BooleanField name="isActive" label={t('Active')} />
            <TextField
              name="url"
              label={t('URL')}
              required
              help={t('The URL which will receive events.')}
            />
            <FormField
              name="events"
              label={t('Events')}
              inline={false}
              help={t('The event types you wish to subscribe to.')}
            >
              {({name, value, onChange}) => (
                <MultipleCheckbox onChange={onChange} value={value} name={name}>
                  {EVENT_CHOICES.map(event => (
                    <MultipleCheckbox.Item key={event} value={event}>
                      {event}
                    </MultipleCheckbox.Item>
                  ))}
                </MultipleCheckbox>
              )}
            </FormField>
          </PanelBody>
        </ApiForm>
      </Panel>
    );
  }
}