"use client";

import { useCallback, useState, useTransition } from "react";
import { useRouter } from "next/navigation";

import { checkVideoGuidePurchase } from "@/entities/dashboard/actions";
import { useSingleCheckout } from "@/hooks/payment/useSingleCheckout";
import { useToast } from "@/providers/toast-provider";
import { ROUTES } from "@/shared/constants/client-routes";

interface UseVideoGuidePurchaseOptions {
  videoGuideId: string;
  productId: string;
  productKey: string;
}

export function useVideoGuidePurchase(options: UseVideoGuidePurchaseOptions) {
  const { productId, productKey } = options;
  const { addToast } = useToast();
  const router = useRouter();
  const [isProcessingPurchase, setIsProcessingPurchase] = useState(false);
  const [isCheckingPurchase, setIsCheckingPurchase] = useState(false);
  const [isPending, startTransition] = useTransition();

  const { handleSingleCheckout, isLoading: isCheckoutLoading } =
    useSingleCheckout({
      onSuccess: async () => {
        // Показываем toast о успешной покупке
        addToast({
          variant: "success",
          message: "Video guide purchased successfully!",
          duration: 3000,
        });

        // Включаем лоадер на всей карточке
        setIsProcessingPurchase(true);

        // Ждем 3 секунды перед обновлением
        await new Promise(resolve => setTimeout(resolve, 3000));

        // Обновляем данные dashboard в transition
        // isPending будет true пока данные загружаются
        startTransition(() => {
          router.refresh();
        });

        // Убираем наш флаг, но isPending продолжит показывать loader
        setIsProcessingPurchase(false);
      },
      onError: error => {
        addToast({
          variant: "error",
          message: error || "Purchase failed. Please try again.",
          duration: 5000,
        });
      },
      returnUrl: new URL(
        ROUTES.home(),
        process.env.NEXT_PUBLIC_APP_URL || ""
      ).toString(),
    });

  const handlePurchase = useCallback(async () => {
    // Сначала проверяем, не куплен ли уже продукт
    setIsCheckingPurchase(true);

    try {
      const result = await checkVideoGuidePurchase(productKey);

      if (result.data && result.data.isPurchased) {
        // Продукт уже куплен! Показываем сообщение и обновляем страницу
        addToast({
          variant: "success",
          message: "You already own this video guide!",
          duration: 3000,
        });

        setIsCheckingPurchase(false);

        // Включаем лоадер на всей карточке
        setIsProcessingPurchase(true);

        // Даем небольшую задержку для плавного UX
        await new Promise(resolve => setTimeout(resolve, 1000));

        // Обновляем данные dashboard в transition
        // isPending будет true пока данные загружаются
        startTransition(() => {
          router.refresh();
        });

        // Убираем наш флаг, но isPending продолжит показывать loader
        setIsProcessingPurchase(false);
        return;
      }

      // Продукт не куплен, продолжаем с checkout
      setIsCheckingPurchase(false);
      handleSingleCheckout({
        productId,
        key: productKey,
      });
    } catch (error) {
      // eslint-disable-next-line no-console
      console.error("Error checking purchase status:", error);
      setIsCheckingPurchase(false);

      // Даже если проверка не удалась, продолжаем с checkout
      // чтобы не блокировать покупку
      handleSingleCheckout({
        productId,
        key: productKey,
      });
    }
  }, [handleSingleCheckout, productId, productKey, addToast, router]);

  return {
    handlePurchase,
    isCheckoutLoading: isCheckoutLoading || isCheckingPurchase, // Загрузка на кнопке (во время checkout или проверки)
    isProcessingPurchase: isProcessingPurchase || isPending, // Загрузка на всей карточке (включая transition)
  };
}
