import { login } from "@api/auth";
import CloseIcon from "@mui/icons-material/Close";
import {
  Box,
  Button,
  Dialog,
  IconButton,
  Link,
  Typography,
  useMediaQuery,
  useTheme,
} from "@mui/material";
import { setUserId, useUserStore } from "@root/user";
import InputTextfield from "@ui_kit/InputTextfield";
import Logotip from "../../pages/Landing/images/icons/QuizLogo";
import PasswordInput from "@ui_kit/passwordInput";
import { useFormik } from "formik";
import { enqueueSnackbar } from "notistack";
import { useEffect, useState } from "react";
import { Link as RouterLink, useNavigate, useLocation } from "react-router-dom";
import { object, string } from "yup";

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

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

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

export default function SigninDialog() {
  const [isDialogOpen, setIsDialogOpen] = useState<boolean>(true);
  const user = useUserStore((state) => state.user);
  const theme = useTheme();
  const upMd = useMediaQuery(theme.breakpoints.up("md"));
  const isMobile = useMediaQuery(theme.breakpoints.down(450));
  const navigate = useNavigate();
  const location = useLocation();

  const formik = useFormik<Values>({
    initialValues,
    validationSchema,
    onSubmit: async (values, formikHelpers) => {
      const [loginResponse, loginError] = await login(
        values.email.trim(),
        values.password.trim(),
      );

      formikHelpers.setSubmitting(false);

      if (loginError) {
        return enqueueSnackbar(loginError);
      }

      if (loginResponse) {
        setUserId(loginResponse._id);
      }
    },
  });

  useEffect(
    function redirectIfSignedIn() {
      if (user) navigate("/list", { replace: true });
    },
    [navigate, user],
  );

  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>
          <Logotip width={upMd ? 233 : 196} />
        </Box>
        <Typography
          sx={{
            color: "#4D4D4D",
            mt: "5px",
            mb: upMd ? "10px" : "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"}
        />
        <PasswordInput
          TextfieldProps={{
            value: formik.values.password,
            placeholder: "Не менее 8 символов",
            onBlur: formik.handleBlur,
            error: formik.touched.password && Boolean(formik.errors.password),
            helperText: formik.touched.password && formik.errors.password,
            type: "password",
            "data-cy": "password",
          }}
          onChange={formik.handleChange}
          color="#F2F3F7"
          id="password"
          label="Пароль"
          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="signin"
        >
          Войти
        </Button>
        <Box
          sx={{
            display: "flex",
            flexDirection: "column",
            alignItems: "center",
            gap: "10px",
            mt: "auto",
          }}
        >
          <Typography sx={{ color: "#7E2AEA", textAlign: "center" }}>
            Вы еще не присоединились?
          </Typography>
          <Box
            sx={{
              display: "flex",
              flexDirection: "column",
              alignItems: "center",
              gap: "15px",
            }}
          >
            <Link
              component={RouterLink}
              to="/signup"
              state={{ backgroundLocation: location.state.backgroundLocation }}
              sx={{
                color: "#7E2AEA",
              }}
            >
              Регистрация
            </Link>
            <Link
              component={RouterLink}
              to="/recover"
              state={{ backgroundLocation: location.state.backgroundLocation }}
              sx={{
                color: "#7E2AEA",
              }}
            >
              Забыли пароль
            </Link>
          </Box>
        </Box>
      </Box>
    </Dialog>
  );
}
