"use client";

import { useCallback, useEffect, useState } from "react";
import { createClient, getBrowserUserId } from "@/lib/supabase/client";
import { useWorkspaceStore } from "@/stores/workspace-store";
import type { SavedView } from "@/types";

export function useSavedViews(scope: SavedView["scope"]) {
  const [views, setViews] = useState<SavedView[]>([]);
  const [loading, setLoading] = useState(true);
  const supabase = createClient();
  const activeTeamId = useWorkspaceStore((state) => state.activeTeamId);
  const initialized = useWorkspaceStore((state) => state.initialized);

  const fetchViews = useCallback(async () => {
    if (!initialized) return;

    setLoading(true);

    let query = supabase
      .from("saved_views")
      .select("*")
      .eq("scope", scope)
      .order("is_favorite", { ascending: false })
      .order("updated_at", { ascending: false });

    query = activeTeamId
      ? query.eq("team_id", activeTeamId)
      : query.is("team_id", null);

    const { data, error } = await query;
    if (error) throw error;

    setViews((data || []) as SavedView[]);
    setLoading(false);
  }, [activeTeamId, initialized, scope, supabase]);

  useEffect(() => {
    const handle = window.setTimeout(() => {
      void fetchViews();
    }, 0);

    return () => window.clearTimeout(handle);
  }, [fetchViews]);

  async function createView(input: {
    name: string;
    filters: Record<string, unknown>;
    is_favorite?: boolean;
  }) {
    const userId = await getBrowserUserId();
    if (!userId) throw new Error("Not authenticated");

    const { data, error } = await supabase
      .from("saved_views")
      .insert({
        user_id: userId,
        team_id: activeTeamId,
        scope,
        name: input.name,
        filters: input.filters,
        is_favorite: input.is_favorite ?? false,
      })
      .select()
      .single();

    if (error) throw error;
    setViews((prev) => [data as SavedView, ...prev]);
    return data as SavedView;
  }

  async function updateView(
    id: string,
    input: Partial<Pick<SavedView, "name" | "filters" | "is_favorite">>
  ) {
    const { data, error } = await supabase
      .from("saved_views")
      .update(input)
      .eq("id", id)
      .select()
      .single();

    if (error) throw error;
    setViews((prev) => prev.map((view) => (view.id === id ? (data as SavedView) : view)));
    return data as SavedView;
  }

  async function deleteView(id: string) {
    const { error } = await supabase.from("saved_views").delete().eq("id", id);
    if (error) throw error;
    setViews((prev) => prev.filter((view) => view.id !== id));
  }

  return {
    views,
    loading,
    createView,
    updateView,
    deleteView,
    refetch: fetchViews,
  };
}
