import { FC, useState } from "react";
import CloseIcon from "@mui/icons-material/Close";
import {
  Box,
  Button,
  Dialog,
  IconButton,
  Link,
  Typography,
  useMediaQuery,
  useTheme,
} from "@mui/material";
import InputTextfield from "@ui_kit/InputTextfield";
import { useFormik } from "formik";
import { object, ref, string } from "yup";
import Logotip from "../Landing/images/icons/QuizLogo";
import { useNavigate, Link as RouterLink, useLocation } from "react-router-dom";
import { enqueueSnackbar } from "notistack";
import { recover } from "@api/auth";

interface Values {
  email: string;
}

const initialValues: Values = {
  email: "",
};

const validationSchema = object({
  email: string()
    .required("Поле обязательно")
    .email("Введите корректный email"),
});

export const Restore: FC = () => {
  const [isDialogOpen, setIsDialogOpen] = useState<boolean>(true);
  const navigate = useNavigate();
  const theme = useTheme();
  const upMd = useMediaQuery(theme.breakpoints.up("md"));
  const isMobile = useMediaQuery(theme.breakpoints.down(450));

  const location = useLocation();

  const formik = useFormik<Values>({
    initialValues,
    validationSchema,
    onSubmit: async (values, formikHelpers) => {
      const [recoverResponse, recoverError] = await recover(
        values.email.trim(),
      );

      formikHelpers.setSubmitting(false);
      if (recoverError) {
        enqueueSnackbar(recoverError);
        return;
      }
      navigate("/");
      enqueueSnackbar("Письмо прийдёт Вам на почту");
    },
  });

  function handleClose() {
    setIsDialogOpen(false);
    setTimeout(() => navigate("/"), theme.transitions.duration.leavingScreen);
  }

  return (
    <Dialog
      open={isDialogOpen}
      onClose={handleClose}
      PaperProps={{
        sx: {
          width: isMobile ? "100%" : "600px",
          maxWidth: isMobile ? "100%" : "600px",
          margin: isMobile ? "0" : "32px",
          maxHeight: isMobile ? "100%" : "-moz-initial",
          height: isMobile ? "100%" : "-moz-initial",
        },
      }}
      slotProps={{
        backdrop: {
          style: {
            backgroundColor: "rgb(0 0 0 / 0.7)",
          },
        },
      }}
    >
      <Box
        component="form"
        onSubmit={formik.handleSubmit}
        noValidate
        sx={{
          height: isMobile ? "100%" : "-moz-initial",
          position: "relative",
          backgroundColor: "white",
          display: "flex",
          alignItems: "center",
          flexDirection: "column",
          p: upMd ? "50px" : "18px",
          pb: upMd ? "40px" : "30px",
          gap: "15px",
          borderRadius: "12px",
          boxShadow: "0px 15px 80px rgb(210 208 225 / 70%)",
          "& .MuiFormHelperText-root.Mui-error, & .MuiFormHelperText-root.Mui-error.MuiFormHelperText-filled":
            {
              position: "absolute",
              top: "46px",
              margin: "0",
            },
        }}
      >
        <IconButton
          onClick={handleClose}
          sx={{
            position: "absolute",
            right: "7px",
            top: "7px",
          }}
        >
          <CloseIcon sx={{ transform: "scale(1.5)" }} />
        </IconButton>
        <Box sx={{ mt: upMd ? undefined : "62px" }}>
          <Logotip width={upMd ? 233 : 196} />
        </Box>
        <Typography
          sx={{
            color: "#4D4D4D",
            mt: "5px",
            mb: upMd ? "30px" : "33px",
          }}
        >
          Восстановление пароля
        </Typography>
        <InputTextfield
          TextfieldProps={{
            value: formik.values.email,
            placeholder: "username",
            onBlur: formik.handleBlur,
            error: formik.touched.email && Boolean(formik.errors.email),
            helperText: formik.touched.email && formik.errors.email,
            "data-cy": "username",
          }}
          onChange={formik.handleChange}
          color="#F2F3F7"
          id="email"
          label="Email"
          gap={upMd ? "10px" : "10px"}
        />
        <Button
          variant="contained"
          fullWidth
          type="submit"
          disabled={formik.isSubmitting}
          sx={{
            py: "12px",
            "&:hover": {
              backgroundColor: "#581CA7",
            },
            "&:active": {
              color: "white",
              backgroundColor: "black",
            },
          }}
          data-cy="signup"
        >
          Восстановить
        </Button>
        <Link
          component={RouterLink}
          to="/signin"
          state={{ backgroundLocation: location.state.backgroundLocation }}
          sx={{
            color: "#7E2AEA",
            mt: "auto",
          }}
        >
          У меня уже есть аккаунт
        </Link>
      </Box>
    </Dialog>
  );
};
