"use client";

import { useEffect, useMemo } from "react";
import { useSession } from "next-auth/react";
import { useGetCompanyByIdQuery } from "@/redux/api/companyApi";
import { useGetUserProfileQuery } from "@/redux/api/userApi";
import { useDispatch, useSelector } from "react-redux";
import { setCompany, setUser, setLoading } from "@/redux/slices/companySlice";
import { RootState } from "@/redux/store";

/**
 * Hook to get company and user data from Redux store
 * Automatically fetches and stores data when IDs are available
 */
export function useCompanyData() {
  const { data: session } = useSession();
  const companyId = session?.companyId;
  const userId = session?.userId;
  const dispatch = useDispatch();
  
  // Get data from Redux store
  const companyFromStore = useSelector(
    (state: RootState) => state.company?.currentCompany ?? null
  );
  
  const userFromStore = useSelector(
    (state: RootState) => state.company?.currentUser ?? null
  );
  
  const isLoadingFromStore = useSelector(
    (state: RootState) => state.company?.isLoading ?? false
  );

  // Fetch company data
  const { data: companyData, isLoading: isCompanyLoading } = useGetCompanyByIdQuery(
    companyId as string,
    {
      skip: !companyId || !!companyFromStore,
    }
  );

  // Fetch user profile data
  const { data: userData, isLoading: isUserLoading } = useGetUserProfileQuery(
    { id: userId as string },
    {
      skip: !userId || !!userFromStore,
    }
  );

  // Update Redux store when data is fetched
  useEffect(() => {
    let changed = false;
    if (companyData?.data && !companyFromStore) {
      dispatch(setCompany(companyData.data));
      changed = true;
    }
    if (userData?.data && !userFromStore) {
      dispatch(setUser(userData.data));
      changed = true;
    }
    
    if (isCompanyLoading || isUserLoading) {
      dispatch(setLoading(true));
    } else if (changed || (!isCompanyLoading && !isUserLoading)) {
      dispatch(setLoading(false));
    }
  }, [companyData, userData, isCompanyLoading, isUserLoading, dispatch, companyFromStore, userFromStore]);

  const company = companyFromStore || companyData?.data;
  const user = userFromStore || userData?.data;
  const isLoading = isCompanyLoading || isUserLoading || isLoadingFromStore;

  // Memoize address object to prevent infinite loops in useEffect dependencies
  const address = useMemo(
    () => ({
      area: company?.area,
      city: company?.city,
      state: company?.state,
      country: company?.country,
      pincode: company?.pincode,
      address: company?.address,
    }),
    [
      company?.area,
      company?.city,
      company?.state,
      company?.country,
      company?.pincode,
      company?.address,
    ]
  );

  return {
    companyName: company?.name || "",
    phone: user?.phone || company?.phone, // Priority to user phone
    address,
    companyData: company,
    userData: user,
    isMetaConnected: user?.isMetaConnected || (session as any)?.isMetaConnected || false,
    accountAccessibleForMeta: user?.accountAccessibleForMeta || (session as any)?.accountAccessibleForMeta || false,
    isLoading,
    companyId,
    userId,
  };
}
