// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: AGPL-3.0

import * as React from 'react';
import { compose } from "redux";
import { reduxForm, InjectedFormProps, Field, WrappedFieldArrayProps, FieldArray } from 'redux-form';
import { withDialog, WithDialogProps } from "~/store/dialog/with-dialog";
import { FormDialog } from '~/components/form-dialog/form-dialog';
import { CREATE_GROUP_DIALOG, CREATE_GROUP_FORM, createGroup, CreateGroupFormData, CREATE_GROUP_NAME_FIELD_NAME, CREATE_GROUP_USERS_FIELD_NAME } from '~/store/groups-panel/groups-panel-actions';
import { TextField } from '~/components/text-field/text-field';
import { maxLength } from '~/validators/max-length';
import { require } from '~/validators/require';
import { PeopleSelect, Person } from '~/views-components/sharing-dialog/people-select';

export const CreateGroupDialog = compose(
    withDialog(CREATE_GROUP_DIALOG),
    reduxForm<CreateGroupFormData>({
        form: CREATE_GROUP_FORM,
        onSubmit: (data, dispatch) => {
            dispatch(createGroup(data));
        }
    })
)(
    (props: CreateGroupDialogComponentProps) =>
        <FormDialog
            dialogTitle='Create a group'
            formFields={CreateGroupFormFields}
            submitLabel='Create'
            {...props}
        />
);

type CreateGroupDialogComponentProps = WithDialogProps<{}> & InjectedFormProps<CreateGroupFormData>;

const CreateGroupFormFields = () =>
    <>
        <GroupNameField />
        <UsersField />
    </>;

const GroupNameField = () =>
    <Field
        name={CREATE_GROUP_NAME_FIELD_NAME}
        component={TextField}
        validate={GROUP_NAME_VALIDATION}
        label="Name"
        autoFocus={true} />;

const GROUP_NAME_VALIDATION = [require, maxLength(255)];

const UsersField = () =>
    <FieldArray
        name={CREATE_GROUP_USERS_FIELD_NAME}
        component={UsersSelect} />;

const UsersSelect = ({ fields }: WrappedFieldArrayProps<Person>) =>
    <PeopleSelect
        onlyPeople
        label='Enter email adresses '
        items={fields.getAll() || []}
        onSelect={fields.push}
        onDelete={fields.remove} />;
