"use client";

import { useCallback, useEffect, useState } from "react";
import { createClient, getBrowserUserId } from "@/lib/supabase/client";
import { hasFullDesignAccess } from "@/lib/notes/design-access";
import type { NoteCover } from "@/lib/notes/note-covers";
import type { Sticker } from "@/lib/notes/note-stickers";
import type { NoteTemplate } from "@/lib/notes/note-templates";

// Covers and stickers are both just "marketplace items" with an id/price,
// and optionally a creator for uploaded covers — purchases are tracked in
// the same note_design_purchases table regardless of which kind it is.
type PurchasableItem = { id: string; price: number; creatorId?: string };

export function useNoteDesignPurchases() {
  const [purchasedIds, setPurchasedIds] = useState<Set<string>>(new Set());
  const [fullAccess, setFullAccess] = useState(false);
  const [userId, setUserId] = useState<string | null>(null);
  const [loading, setLoading] = useState(true);
  const [purchasingId, setPurchasingId] = useState<string | null>(null);
  const [error, setError] = useState<string | null>(null);
  const supabase = createClient();

  const fetchPurchases = useCallback(async () => {
    setLoading(true);
    const currentUserId = await getBrowserUserId();
    setUserId(currentUserId);
    const { data: userData } = await supabase.auth.getUser();
    setFullAccess(hasFullDesignAccess(userData.user?.email));

    if (!currentUserId) {
      setPurchasedIds(new Set());
      setLoading(false);
      return;
    }

    const { data } = await supabase
      .from("note_design_purchases")
      .select("design_id")
      .eq("user_id", currentUserId);
    setPurchasedIds(new Set((data || []).map((row) => row.design_id as string)));
    setLoading(false);
  }, [supabase]);

  useEffect(() => {
    void fetchPurchases();
  }, [fetchPurchases]);

  // Free, full-access, already purchased, or your own upload — creators
  // always get to use their own design without paying for it.
  const ownsItem = useCallback(
    (item: PurchasableItem) =>
      item.price === 0 || fullAccess || purchasedIds.has(item.id) || (!!userId && item.creatorId === userId),
    [fullAccess, purchasedIds, userId]
  );
  const ownsCover = useCallback((cover: NoteCover) => ownsItem(cover), [ownsItem]);
  const ownsSticker = useCallback((sticker: Sticker) => ownsItem(sticker), [ownsItem]);
  const ownsTemplate = useCallback((template: NoteTemplate) => ownsItem(template), [ownsItem]);

  const purchaseItem = useCallback(
    async (item: PurchasableItem) => {
      setPurchasingId(item.id);
      setError(null);
      try {
        const res = await fetch("/api/notes/designs/checkout", {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({ designId: item.id }),
        });
        const json = await res.json();
        if (!res.ok || !json.url) throw new Error(json.error || "Checkout could not be started");
        window.location.href = json.url;
      } catch (err) {
        setError(err instanceof Error ? err.message : "Checkout could not be started");
        setPurchasingId(null);
      }
    },
    []
  );

  return {
    purchasedIds,
    fullAccess,
    userId,
    loading,
    purchasingId,
    error,
    ownsCover,
    ownsSticker,
    ownsTemplate,
    purchaseCover: purchaseItem,
    purchaseSticker: purchaseItem,
    purchaseTemplate: purchaseItem,
    refetch: fetchPurchases,
  };
}
