import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { ApiError, apiDelete, apiGet, apiPost, apiPut } from "../lib/api";

interface ThreadListItem {
	id: number;
	name: string;
	status: "active" | "resolved";
	resolvedCandidateId: number | null;
	categoryId: number;
	categoryName: string;
	categoryIcon: string;
	createdAt: string;
	updatedAt: string;
	candidateCount: number;
	minPriceCents: number | null;
	maxPriceCents: number | null;
}

interface CandidateWithCategory {
	id: number;
	threadId: number;
	name: string;
	weightGrams: number | null;
	priceCents: number | null;
	categoryId: number;
	notes: string | null;
	productUrl: string | null;
	imageFilename: string | null;
	status: "researching" | "ordered" | "arrived";
	pros: string | null;
	cons: string | null;
	createdAt: string;
	updatedAt: string;
	categoryName: string;
	categoryIcon: string;
}

interface ThreadWithCandidates {
	id: number;
	name: string;
	status: "active" | "resolved";
	resolvedCandidateId: number | null;
	categoryId: number;
	createdAt: string;
	updatedAt: string;
	candidates: CandidateWithCategory[];
}

export function useThreads(includeResolved = false) {
	return useQuery({
		queryKey: ["threads", { includeResolved }],
		queryFn: () =>
			apiGet<ThreadListItem[]>(
				`/api/threads${includeResolved ? "?includeResolved=true" : ""}`,
			),
	});
}

export function useThread(threadId: number | null) {
	return useQuery({
		queryKey: ["threads", threadId],
		queryFn: () => apiGet<ThreadWithCandidates>(`/api/threads/${threadId}`),
		enabled: threadId != null,
		retry: (count, error) =>
			error instanceof ApiError && error.status === 404 ? false : count < 3,
	});
}

export function useCreateThread() {
	const queryClient = useQueryClient();
	return useMutation({
		mutationFn: (data: { name: string; categoryId: number }) =>
			apiPost<ThreadListItem>("/api/threads", data),
		onSuccess: () => {
			queryClient.invalidateQueries({ queryKey: ["threads"] });
		},
	});
}

export function useUpdateThread() {
	const queryClient = useQueryClient();
	return useMutation({
		mutationFn: ({ id, ...data }: { id: number; name?: string }) =>
			apiPut<ThreadListItem>(`/api/threads/${id}`, data),
		onSuccess: () => {
			queryClient.invalidateQueries({ queryKey: ["threads"] });
		},
	});
}

export function useDeleteThread() {
	const queryClient = useQueryClient();
	return useMutation({
		mutationFn: (id: number) =>
			apiDelete<{ success: boolean }>(`/api/threads/${id}`),
		onSuccess: () => {
			queryClient.invalidateQueries({ queryKey: ["threads"] });
		},
	});
}

export function useResolveThread() {
	const queryClient = useQueryClient();
	return useMutation({
		mutationFn: ({
			threadId,
			candidateId,
		}: {
			threadId: number;
			candidateId: number;
		}) =>
			apiPost<{ success: boolean; item: unknown }>(
				`/api/threads/${threadId}/resolve`,
				{ candidateId },
			),
		onSuccess: () => {
			queryClient.invalidateQueries({ queryKey: ["threads"] });
			queryClient.invalidateQueries({ queryKey: ["items"] });
			queryClient.invalidateQueries({ queryKey: ["totals"] });
		},
	});
}
