import { useQuery } from "@tanstack/react-query";

import { normalizeSwfAssetToLayer } from "./shared-types";

export function useAltStylesForSpecies(speciesId, options = {}) {
	return useQuery({
		...options,
		queryKey: ["altStylesForSpecies", String(speciesId)],
		queryFn: () => loadAltStylesForSpecies(speciesId),
		enabled: (options.enabled ?? true) && speciesId != null,
	});
}

// NOTE: This is actually just a wrapper for `useAltStylesForSpecies`, to share
// the same cache key!
export function useAltStyle(id, speciesId, options = {}) {
	const query = useAltStylesForSpecies(speciesId, {
		...options,
		enabled: (options.enabled ?? true) && id != null,
	});

	return {
		...query,
		data: query.data?.find((s) => s.id === id) ?? null,
	};
}

async function loadAltStylesForSpecies(speciesId) {
	const res = await fetch(
		`/species/${encodeURIComponent(speciesId)}/alt-styles.json`,
	);

	if (!res.ok) {
		throw new Error(
			`loading alt styles failed: ${res.status} ${res.statusText}`,
		);
	}

	return res.json().then(normalizeAltStyles);
}

function normalizeAltStyles(altStylesData) {
	return altStylesData.map(normalizeAltStyle);
}

function normalizeAltStyle(altStyleData) {
	return {
		id: String(altStyleData.id),
		speciesId: String(altStyleData.species_id),
		colorId: String(altStyleData.color_id),
		bodyId: String(altStyleData.body_id),
		seriesName: altStyleData.series_name,
		adjectiveName: altStyleData.adjective_name,
		thumbnailUrl: altStyleData.thumbnail_url,

		// This matches the PetAppearanceForOutfitPreview GQL fragment!
		appearance: {
			bodyId: String(altStyleData.body_id),
			pose: "UNKNOWN",
			isGlitched: false,
			species: { id: String(altStyleData.species_id) },
			color: { id: String(altStyleData.species_id) },
			layers: altStyleData.swf_assets.map(normalizeSwfAssetToLayer),
			restrictedZones: [],
		},
	};
}