import { useDebounce } from "../util";
import { useItemSearch } from "../loaders/items";
import { emptySearchQuery, searchQueryIsEmpty } from "./SearchToolbar";
import { SEARCH_PER_PAGE } from "./SearchPanel";

/**
 * useSearchResults manages the actual querying and state management of search!
 */
export function useSearchResults(
	query,
	outfitState,
	currentPageNumber,
	{ skip = false } = {},
) {
	const { speciesId, colorId, altStyleId } = outfitState;

	// We debounce the search query, so that we don't resend a new query whenever
	// the user types anything.
	const debouncedQuery = useDebounce(query, 300, {
		waitForFirstPause: true,
		initialValue: emptySearchQuery,
	});

	const { isLoading, error, data } = useItemSearch(
		{
			filters: buildSearchFilters(debouncedQuery, outfitState),
			withAppearancesFor: { speciesId, colorId, altStyleId },
			page: currentPageNumber,
			perPage: SEARCH_PER_PAGE,
		},
		{
			enabled: !skip && !searchQueryIsEmpty(debouncedQuery),
		},
	);

	const loading = debouncedQuery !== query || isLoading;
	const items = data?.items ?? [];
	const numTotalPages = data?.numTotalPages ?? 0;

	return { loading, error, items, numTotalPages };
}

function buildSearchFilters(query, { speciesId, colorId, altStyleId }) {
	const filters = [];

	// TODO: We're missing quote support, like `background "Dyeworks White"`.
	//       It might be good to, rather than parse this out here and send it as
	//       filters, include a text-based part of the query as well, and have
	//       the server merge them? That'd support text-based `is:nc` etc too.
	const words = query.value.split(/\s+/);
	for (const word of words) {
		filters.push({ key: "name", value: word });
	}

	if (query.filterToItemKind === "NC") {
		filters.push({ key: "is_nc" });
	} else if (query.filterToItemKind === "PB") {
		filters.push({ key: "is_pb" });
	} else if (query.filterToItemKind === "NP") {
		filters.push({ key: "is_np" });
	}

	if (query.filterToZoneLabel != null) {
		filters.push({
			key: "occupied_zone_set_name",
			value: query.filterToZoneLabel,
		});
	}

	if (query.filterToCurrentUserOwnsOrWants === "OWNS") {
		filters.push({ key: "user_closet_hanger_ownership", value: "true" });
	} else if (query.filterToCurrentUserOwnsOrWants === "WANTS") {
		filters.push({ key: "user_closet_hanger_ownership", value: "false" });
	}

	filters.push({
		key: "fits",
		value: { speciesId, colorId, altStyleId },
	});

	return filters;
}