import React, { useState } from 'react';
import { Formik, Form, Field } from 'formik';
import { post } from 'lib/web';
import Button from 'components/common/Button';
import FormLayout, {
  FormButtons,
  FormError,
  FormMessage,
  FormRow,
} from 'components/layout/FormLayout';

const initialValues = {
  current_password: '',
  new_password: '',
  confirm_password: '',
};

const validate = ({ current_password, new_password, confirm_password }) => {
  const errors = {};

  if (!current_password) {
    errors.current_password = 'Required';
  }
  if (!new_password) {
    errors.new_password = 'Required';
  }
  if (!confirm_password) {
    errors.confirm_password = 'Required';
  } else if (new_password !== confirm_password) {
    errors.confirm_password = `Passwords don't match`;
  }

  return errors;
};

export default function ChangePasswordForm({ values, onSave, onClose }) {
  const [message, setMessage] = useState();

  const handleSubmit = async values => {
    const response = await post(`/api/account/password`, values);

    if (typeof response !== 'string') {
      onSave();
    } else {
      setMessage(response || 'Something went wrong');
    }
  };

  return (
    <FormLayout>
      <Formik
        initialValues={{ ...initialValues, ...values }}
        validate={validate}
        onSubmit={handleSubmit}
      >
        {() => (
          <Form>
            <FormRow>
              <label htmlFor="current_password">Current password</label>
              <Field name="current_password" type="password" />
              <FormError name="current_password" />
            </FormRow>
            <FormRow>
              <label htmlFor="new_password">New password</label>
              <Field name="new_password" type="password" />
              <FormError name="new_password" />
            </FormRow>
            <FormRow>
              <label htmlFor="confirm_password">Confirm password</label>
              <Field name="confirm_password" type="password" />
              <FormError name="confirm_password" />
            </FormRow>
            <FormButtons>
              <Button type="submit" variant="action">
                Save
              </Button>
              <Button onClick={onClose}>Cancel</Button>
            </FormButtons>
            <FormMessage>{message}</FormMessage>
          </Form>
        )}
      </Formik>
    </FormLayout>
  );
}