import { useEffect, useLayoutEffect, useRef } from "react";
import { createUserAccount, devlog } from "@frontend/kitui";
import { isAxiosError } from "axios";
import { makeRequest } from "@frontend/kitui";
import type { UserAccount } from "@frontend/kitui";
import { setUserAccount } from "@/stores/user";

export const useUserAccountFetcher = <T = UserAccount>({
  onError,
  onNewUserAccount,
  url,
  userId,
}: {
  url: string;
  userId: string | null;
  onNewUserAccount: (response: T) => void;
  onError?: (error: any) => void;
}) => {
  const onNewUserAccountRef = useRef(onNewUserAccount);
  const onErrorRef = useRef(onError);
  
  useLayoutEffect(() => {
    onNewUserAccountRef.current = onNewUserAccount;
    onErrorRef.current = onError;
  }, [onError, onNewUserAccount]);

  useEffect(() => {
    if (!userId) return;
    const controller = new AbortController();
    makeRequest<never, T>({
      url,
      contentType: true,
      method: "GET",
      useToken: true,
      withCredentials: false,
      signal: controller.signal,
    })
      .then((result) => {
        devlog("User account", result);
        if (result) onNewUserAccountRef.current(result);
      })
      .catch((error) => {
        devlog("Error fetching user account", error);
        if (error.response?.status === 409) return;
        if (isAxiosError(error) && error.response?.status === 404) {
          
          // Формируем правильный URL для создания аккаунта
          let createUrl = url;
          if (url.includes("/customer/v1.0.1/account")) {
            // Для customerAccount используем тот же URL (POST запрос)
            createUrl = url;
          } else if (url.includes("/squiz/account/get")) {
            // Для userAccount заменяем get на create
            createUrl = url.replace("get", "create");
          }
          
          
          createUserAccount(controller.signal, createUrl)
            .then((result) => {
              devlog("Created user account", result);
              
              // Проверяем структуру ответа и записываем в стор
              if (result) {
                // Если результат содержит created_account, используем его
                if (result.created_account) {
                  onNewUserAccountRef.current(result.created_account as T);
                } 
                // Если результат сам является аккаунтом (для customerAccount)
                else if (result.userId && result.wallet) {
                  onNewUserAccountRef.current(result as T);
                }
                // Если ничего не подходит, логируем для диагностики
                else {
                  onNewUserAccountRef.current(result as T);
                }
              }
            })
            .catch((error) => {
              if (error.response?.status === 409) return;
              devlog("Error creating user account", error);
              console.error("useUserAccountFetcher: Error creating account:", error);
              onErrorRef.current?.(error);
            });
        } else {
          console.error(error)
          onErrorRef.current?.(error);
        }
      });
    return () => controller.abort();
  }, [url, userId]);
};
