import { useEffect } from "react";
import { useNavigate } from "@remix-run/react";
import { useMyStores } from "../requestHandler/use-seller-hooks";

/**
 * Guards a store dashboard route. A user may enter a store they OWN or are an
 * active STAFF member of. Non-members are redirected away. Returns the user's
 * role for this store so callers can gate owner-only UI.
 */
export function useStoreOwnership(storeId: string | undefined, mode?: string) {
  const navigate = useNavigate();
  const { data: stores, isLoading, isFetching, isError } = useMyStores();

  const current = stores?.find(
    (s) => s.username?.toLowerCase() === storeId?.toLowerCase()
  );

  useEffect(() => {
    if (isLoading || isFetching || isError || mode === "create") return;
    if (!storeId) {
      navigate("/");
      return;
    }
    if (!stores || stores.length === 0) return; // nothing to compare against yet
    if (!current) {
      // The user is a member of at least one OTHER store — send them there.
      // If they're not a member of any store, do NOT bounce to home: staying
      // put lets an owner see their (empty) dashboard rather than being
      // silently kicked out on a transient/mismatched my-stores response.
      navigate(`/store/${stores[0].username}`);
    }
  }, [
    stores,
    current,
    storeId,
    isLoading,
    isFetching,
    isError,
    navigate,
    mode,
  ]);

  const ownedOrFirst = stores?.find((s) => s.role === "owner") ?? stores?.[0];

  return {
    isLoading,
    isMember: !!current,
    role: current?.role ?? null,
    isOwner: current?.role === "owner",
    userStoreId: ownedOrFirst?.username,
    stores: stores ?? [],
  };
}

/**
 * Guard for OWNER-ONLY store pages (financial, shipping, edit, team). Redirects
 * non-members (via useStoreOwnership) and staff members back to the dashboard.
 * Returns { isLoading, isOwner } so callers can render a spinner meanwhile.
 */
export function useRequireOwner(storeId: string | undefined) {
  const navigate = useNavigate();
  const { isLoading, role } = useStoreOwnership(storeId);

  useEffect(() => {
    if (!isLoading && role && role !== "owner") {
      navigate(`/store/${storeId}`);
    }
  }, [isLoading, role, storeId, navigate]);

  return { isLoading, isOwner: role === "owner" };
}
