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

import React from 'react';
import { StringArrayCommandInputParameter } from 'models/workflow';
import { Field } from 'redux-form';
import { GenericInputProps } from 'views/run-process-panel/inputs/generic-input';
import { ChipsInput } from 'components/chips-input/chips-input';
import { identity } from 'lodash';
import { withStyles, WithStyles, FormGroup, Input, InputLabel, FormControl } from '@material-ui/core';

export interface StringArrayInputProps {
  name: string;
  input: StringArrayCommandInputParameter;
  required: boolean;
}

type CssRules = 'chips';

const styles = {
    chips: {
        marginTop: "16px",
    },
};

export const GroupArrayInput = ({name, input}: StringArrayInputProps) =>
    <Field
        name={name}
        commandInput={input}
        component={StringArrayInputComponent as any}
        />;

const StringArrayInputComponent = (props: GenericInputProps) => {
  return <FormGroup>
        <FormControl fullWidth error={props.meta.error}>
          <InputLabel shrink={props.meta.active || props.input.value.length > 0}>{props.commandInput.id}</InputLabel>
          <StyledInputComponent {...props} />
        </FormControl>
    </FormGroup>;
    };

const StyledInputComponent = withStyles(styles)(
  class InputComponent extends React.PureComponent<GenericInputProps & WithStyles<CssRules>>{
      render() {
          const { classes } = this.props;
          const { commandInput, input, meta } = this.props;
          return <ChipsInput
              deletable={!commandInput.disabled}
              orderable={!commandInput.disabled}
              disabled={commandInput.disabled}
              values={input.value}
              onChange={this.handleChange}
              handleFocus={input.onFocus}
              createNewValue={identity}
              inputComponent={Input}
              chipsClassName={classes.chips}
              pattern={/[_a-z][-0-9_a-z]*/ig}
              inputProps={{
                  error: meta.error,
              }} />;
      }

      handleChange = (values: {}[]) => {
        const { input, meta } = this.props;
          if (!meta.touched) {
              input.onBlur(values);
          }
          input.onChange(values);
      }

  }
);