import { baseAPI } from "@/Shared/API/baseAPI";
import { IFetch } from "@/Shared/types";
import axios from "axios";
import { create } from "zustand";

interface SignUpStore extends IFetch {
  register: (
    email: string,
    password: string,
    confirmPassword: string
  ) => Promise<void>;
  cleanRedirect: () => void;
  emailError: string;
  passwordError: string;
  confirmPasswordError: string;
  matchPasswordError: string;
  redirect: boolean;
}

export const useSignUp = create<SignUpStore>((set) => ({
  loading: false,
  error: "",
  emailError: "",
  passwordError: "",
  confirmPasswordError: "",
  matchPasswordError: "",
  redirect: false,
  register: async (
    email: string,
    password: string,
    confirmPassword: string
  ) => {
    if (!email.trim()) {
      set({ passwordError: "" });
      set({ confirmPasswordError: "" });
      set({ matchPasswordError: "" });
      set({ emailError: "Пожалуйста введите почту" });

      return;
    }
    if (!password.trim()) {
      set({ emailError: "" });
      set({ confirmPasswordError: "" });
      set({ matchPasswordError: "" });
      set({ passwordError: "Пожалуйста введите пароль" });
      return;
    }

    if (!confirmPassword.trim()) {
      set({ emailError: "" });
      set({ passwordError: "" });
      set({ matchPasswordError: "" });
      set({ confirmPasswordError: "Пожалуйста введите пароль" });
      return;
    }

    if (validatePassword(password)) {
      set({ emailError: "" });
      set({ passwordError: "" });
      set({ matchPasswordError: "" });
      set({ confirmPasswordError: "" });
      set({ error: "Минимум 8 символов, 1 заглавная буква и цифра" });

      return;
    }

    if (password !== confirmPassword) {
      set({ emailError: "" });
      set({ confirmPasswordError: "" });
      set({ passwordError: "" });
      set({ matchPasswordError: "Пароли не совпадают" });
      return;
    }

    const user = {
      email,
      password,
      password2: confirmPassword,
    };

    try {
      set({ loading: true });

      const response = await axios.post(
        `${baseAPI}/users/register/`,
        user
      );

      localStorage.setItem("tokens", JSON.stringify(response.data));

      set({ emailError: "" });
      set({ passwordError: "" });
      set({ confirmPasswordError: "" });
      set({ matchPasswordError: "" });
      set({ error: "" });
      set({ redirect: true });
    } catch (error: any) {
      set({ emailError: "" });
      set({ passwordError: "" });
      set({ confirmPasswordError: "" });
      set({ matchPasswordError: "" });
      set({ error: error.message });
    } finally {
      set({ loading: false });
    }
  },
  cleanRedirect: () => {
    set({ redirect: false });
  },
}));

const validatePassword = (password: string) => {
  const regex = /[A-Z]/;
  const digitRegex = /\d/;
  if (password.length < 8) return true;
  console.log("1");
  if (!regex.test(password) || !digitRegex.test(password))
    return true;

  return false;
};