import { useState } from "react";

import { apiRequest } from "@api/request";

export const useFormValidation = (
  apiEndpoint,
  fields,
  showNotificationError,
  showNotificationTrue
) => {
  // Состояние формы, содержащее значения полей
  const [formData, setFormData] = useState(fields);

  // Состояние ошибок валидации
  const [validationErrors, setValidationErrors] = useState({});

  // Функция для обработки изменений в полях ввода
  const handleChange = (e) => {
    const { id, value } = e.target;
    setFormData((prevData) => ({ ...prevData, [id]: value }));
  };

  // Функция для валидации формы
  const validateForm = () => {
    const errors = {};
    if (formData.username != undefined) {
      if (formData.username.trim() === "") {
        errors.username = "Имя обязательно к заполнению";
      }
    }

    if (formData.email != undefined) {
      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      if (formData.email.trim() === "") {
        errors.email = "E-mail обязателен к заполнению";
      } else if (!emailRegex.test(formData.email)) {
        errors.email = "Неверный адрес электронной почты";
      }
    }

    if (formData.tg != undefined) {
      if (formData.tg.trim() === "") {
        errors.tg = "Telegram обязателен к заполнению";
      }
    }

    if (formData.password != undefined) {
      if (formData.password.trim() === "") {
        errors.password = "Пароль обязателен к заполнению";
      } else if (formData.password.length < 8) {
        errors.password = "Пароль должен содержать более 8 символов";
      }
    }

    if (formData.secondPassword != undefined) {
      if (formData.secondPassword.trim() === "") {
        errors.secondPassword = "Повторите пароль";
      } else if (formData.secondPassword !== formData.password) {
        errors.secondPassword = "Пароли должны совпадать";
      }
    }

    setValidationErrors(errors);

    // Возвращаем true, если ошибок нет, иначе - false
    return Object.keys(errors).length === 0;
  };

  // Функция отчистки формы
  const handleClearForm = () => {
    const clearedFormData = Object.fromEntries(
      Object.keys(formData).map((key) => [key, ""])
    );
    setFormData(clearedFormData);

    const clearedValidationErrors = Object.fromEntries(
      Object.keys(validationErrors).map((key) => [key, ""])
    );
    setValidationErrors(clearedValidationErrors);
  };

  // Функция для обработки отправки формы
  const handleSubmit = async (e) => {
    e.preventDefault();
    // Проверка валидации формы
    if (validateForm()) {
      let newformData = { ...formData };
      delete newformData.secondPassword;

      try {
        apiRequest(apiEndpoint, {
          method: "POST",
          data: newformData
        }).then((data) => {
          if ("errors" in data) {
            showNotificationError();
          } else {
            handleClearForm();
            showNotificationTrue();
          }
        });
      } catch (error) {
        console.error("Error submitting form:", error);
      }
      return true;
    } else {
      return false;
    }
  };

  return {
    formData,
    validationErrors,
    handleChange,
    handleSubmit,
    handleClearForm
  };
};
