import React, { useEffect, useState, useRef } from "react";
import { useNavigate, useSearchParams } from "react-router-dom";
import { cancelPayCartProcess, setNotEnoughMoneyAmount, startPayCartProcess } from "@root/stores/allTypesOfPurchases";
import { useUserStore } from "@root/stores/user";
import { setAction, setBackWay, setFromDomain, setAdditionalinformation } from "@root/stores/allTypesOfPurchases";
import { Action, FromDomain } from "@root/model/autoPay";

export const useAutoPay = (): [string, React.Dispatch<React.SetStateAction<string>>] => {
  const navigate = useNavigate();
  const [searchParams] = useSearchParams();
  const hasProcessed = useRef(false);

  const userId = useUserStore(store => store.userId)
  const [paymentValueField, setPaymentValueField] = useState<string>("0");

  useEffect(() => {
    // Если уже обработали, не выполняем повторно
    if (hasProcessed.current) {
      console.log("useAutoPay - уже обработано, пропускаем");
      return;
    }

    console.log("useAutoPay - useEffect запущен");
    
    // Сначала извлекаем все параметры
    let URLfromDomain = searchParams.get("fromdomain");//домен откуда произошёл запрос на финансовые работы
    let URLaction = searchParams.get("action");//что мы, собсна, хотим: оплатить, пополнить, купить и создать квиз
    let URLuserId = searchParams.get("userid");//тот кто начал всё это действо
    const URLwayBack = searchParams.get("wayback") ?? "";//путь по которому нужно будет пройти после того как закончим манипуляции (без домена)
    let URLmoneyDifferent = Number(searchParams.get("dif"));//сколько нужно деняк (в копейках)
    const URLadditionalinformation = searchParams.get("additionalinformation") ?? "";//дополнительная информация

    console.log("useAutoPay - извлеченные параметры:");
    console.log("URLfromDomain:", URLfromDomain);
    console.log("URLaction:", URLaction);
    console.log("URLuserId:", URLuserId);
    console.log("URLwayBack:", URLwayBack);
    console.log("URLmoneyDifferent (копейки):", URLmoneyDifferent);
    console.log("URLadditionalinformation:", URLadditionalinformation);
    console.log("userId:", userId);

    // Если нет URL параметров, но мы уже на странице /payment, не делаем ничего
    if (!URLfromDomain && !URLaction && !URLuserId && URLmoneyDifferent === 0) {
      console.log("useAutoPay - нет URL параметров, но мы уже на /payment, пропускаем");
      hasProcessed.current = true;
      return;
    }

    //Анализ нужно ли вообще вмешательство этого хука
    const condition1 = URLuserId !== null && URLuserId && URLuserId === userId;
    const condition2 = URLfromDomain === "quiz" || URLfromDomain === "squiz" || URLfromDomain === "hub" || URLfromDomain === "shub" || URLfromDomain === "localhost:3000";
    const condition3 = URLaction === "topupwallet" || URLaction === "createquizcc" || URLaction === "buy";
    const condition4 = !Number.isNaN(URLmoneyDifferent);
    
    console.log("useAutoPay - проверка условий:");
    console.log("condition1 (userId совпадает):", condition1);
    console.log("condition2 (fromDomain валидный):", condition2);
    console.log("condition3 (action валидный):", condition3);
    console.log("condition4 (moneyDifferent валидный):", condition4);

    if (condition1 && condition2 && condition3 && condition4) {
      console.log("useAutoPay - условия выполнены, устанавливаем значения");

      // Ставим флаг, что сайт в состоянии ожидания пополнения счёта для оплаты
      startPayCartProcess(URLuserId);

      console.log("useAutoPay - устанавливаем fromDomain:", URLfromDomain);
      setFromDomain(URLfromDomain as FromDomain);
      
      const processedBackWay = URLwayBack.startsWith('/') ? URLwayBack.slice(1) : URLwayBack;
      console.log("useAutoPay - устанавливаем backWay:", processedBackWay);
      setBackWay(processedBackWay);
      
      console.log("useAutoPay - устанавливаем action:", URLaction);
      setAction(URLaction as Action);
      
      console.log("useAutoPay - устанавливаем additionalinformation:", URLadditionalinformation);
      setAdditionalinformation(URLadditionalinformation);
      
      // URLmoneyDifferent в копейках, конвертируем в рубли для отображения
      const rubles = URLmoneyDifferent / 100;
      setPaymentValueField(rubles.toString());
      setNotEnoughMoneyAmount(URLmoneyDifferent);

      console.log("useAutoPay - установлено paymentValueField (рубли):", rubles.toString());
      console.log("useAutoPay - установлено backWay:", processedBackWay);
      console.log("useAutoPay - установлено additionalinformation:", URLadditionalinformation);

      // Только после установки всех значений делаем навигацию
      navigate("/payment", { replace: true });
    } else {
      console.log("useAutoPay - условия не выполнены, отменяем процесс");
      console.log("Причины:");
      if (!condition1) console.log("- userId не совпадает");
      if (!condition2) console.log("- fromDomain не валидный:", URLfromDomain);
      if (!condition3) console.log("- action не валидный:", URLaction);
      if (!condition4) console.log("- moneyDifferent не валидный:", URLmoneyDifferent);
      cancelPayCartProcess();
    }

    // Отмечаем, что обработали
    hasProcessed.current = true;
    
    // Убираем cleanup функцию, так как она вызывается слишком рано
    // Cleanup будет в Payment компоненте при размонтировании
  }, [searchParams, userId, navigate])
  
  return [paymentValueField, setPaymentValueField];
}