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

import React from "react";
import { Field, FieldArray, Validator, WrappedFieldArrayProps } from "redux-form";
import { TextField, RichEditorTextField } from "components/text-field/text-field";
import { PROJECT_NAME_VALIDATION, PROJECT_NAME_VALIDATION_ALLOW_SLASH } from "validators/validators";
import { connect } from "react-redux";
import { RootState } from "store/store";
import { Participant, ParticipantSelect } from "views-components/sharing-dialog/participant-select";

interface ProjectNameFieldProps {
    validate: Validator[];
    label?: string;
}

// Validation behavior depends on the value of ForwardSlashNameSubstitution.
//
// Redux form doesn't let you pass anonymous functions to 'validate'
// -- it fails with a very confusing recursive-update-exceeded error.
// So we can't construct the validation function on the fly.
//
// As a workaround, use ForwardSlashNameSubstitution to choose between one of two const-defined validators.

export const ProjectNameField = connect(
    (state: RootState) => {
        return {
            validate: (state.auth.config.clusterConfig.Collections.ForwardSlashNameSubstitution === "" ?
                PROJECT_NAME_VALIDATION : PROJECT_NAME_VALIDATION_ALLOW_SLASH)
        };
    })((props: ProjectNameFieldProps) =>
        <span data-cy='name-field'><Field
            name='name'
            component={TextField as any}
            validate={props.validate}
            label={props.label || "Project Name"}
            autoFocus={true} /></span>
    );

export const ProjectDescriptionField = () =>
    <Field
        name='description'
        component={RichEditorTextField as any}
        label="Description" />;

export const UsersField = () =>
        <span data-cy='users-field'><FieldArray
            name="users"
            component={UsersSelect as any} /></span>;

export const UsersSelect = ({ fields }: WrappedFieldArrayProps<Participant>) =>
        <ParticipantSelect
            onlyPeople
            label='Search for users to add to the group'
            items={fields.getAll() || []}
            onSelect={fields.push}
            onDelete={fields.remove} />;