import React, { FC } from 'react';
import axios from 'axios';
import { SubmitHandler, useForm } from 'react-hook-form';
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';
import { Button } from '@material-ui/core';
import { InputField } from 'components/AuthUser/SignInForm/InputField/InputField';
import { useHistory } from 'react-router-dom';
import { AuthRoutes } from 'components/api/routes';

const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    root: {
      '& > *': {
        margin: theme.spacing(0),
      },
    },
    form: {
      width: '100%', // Fix IE 11 issue.
      marginTop: theme.spacing(1),
    },
    submit: {
      margin: theme.spacing(3, 0, 2),
    },
  }),
);

export const SignInForm: FC = () => {
  const history = useHistory();

  interface FormData {
    email: string;
    password: string;
  }

  const defaultValues: FormData = {
    email: '',
    password: '',
  };

  const { control, errors, handleSubmit } = useForm<FormData>({
    defaultValues,
  });

  const onSubmit: SubmitHandler<FormData> = (values: FormData) => {
    axios
      .post(
        '/api/web/login',
        {
          username: values.email,
          password: values.password,
        },
        {
          headers: {
            'Content-Type': 'application/json',
          },
        },
      )
      .then(() => history.replace(AuthRoutes.dashboard));
  };

  const classes = useStyles();
  return (
    <>
      <form
        className={classes.form}
        onSubmit={handleSubmit(onSubmit)}
        data-testid="Form"
      >
        <InputField
          name="email"
          control={control}
          rules={{
            validate: (value: string) =>
              /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(value),
            required: {
              value: true,
              message: 'Email is not valid',
            },
          }}
          label="Email"
          error={!!errors.email}
          errorMessage="Insert email"
        />

        <InputField
          name="password"
          control={control}
          rules={{
            minLength: 8,
            maxLength: 60,
            required: {
              value: true,
              message: 'Insert valid password',
            },
          }}
          label="Password"
          error={!!errors.password}
          errorMessage="Insert valid password"
        />

        <Button
          data-testid="Submit"
          type="submit"
          fullWidth
          variant="contained"
          color="primary"
          className={classes.submit}
        >
          Sign In
        </Button>
      </form>
    </>
  );
};