import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useAuthToken } from "./use-root-data";
import { getApiBaseUrl } from "~/utils/api-config";

// The API returns these as camelCase (DRF's global camel-case renderer converts
// the snake_case source names). Match the wire shape here so reads aren't
// silently undefined.
export interface BadgeCounts {
  chat: number;
  sellerChat: Record<string, number>;
  orderUpdates: number;
  sellerOrders: number;
}

const EMPTY: BadgeCounts = {
  chat: 0,
  sellerChat: {},
  orderUpdates: 0,
  sellerOrders: 0,
};

export const badgeKeys = {
  all: ["notif-badges"] as const,
};

/**
 * Polls unread counts for the nav badges (chat / buyer order updates / seller
 * new orders). Lightweight: a single endpoint, refetched on an interval and
 * when the tab regains focus.
 */
export function useBadgeCounts() {
  const token = useAuthToken();
  const apiBase = getApiBaseUrl();

  return useQuery({
    queryKey: badgeKeys.all,
    enabled: !!token,
    refetchInterval: 30000,
    refetchOnWindowFocus: true,
    queryFn: async (): Promise<BadgeCounts> => {
      if (!token) return EMPTY;
      const res = await fetch(`${apiBase}/api/notif/v1/badges/`, {
        headers: { Authorization: `Bearer ${token}` },
      });
      if (!res.ok) return EMPTY;
      return (await res.json()) as BadgeCounts;
    },
  });
}

/**
 * Marks a badge category ("order_updates" | "seller_orders") as read, then
 * refreshes the counts. Chat clears via the existing per-thread read flow.
 */
export function useMarkBadgeRead() {
  const token = useAuthToken();
  const apiBase = getApiBaseUrl();
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: async (category: "order_updates" | "seller_orders") => {
      if (!token) return;
      await fetch(`${apiBase}/api/notif/v1/badges/mark-read/`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${token}`,
        },
        body: JSON.stringify({ category }),
      });
    },
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: badgeKeys.all });
    },
  });
}
