<script lang="ts">
	import { browser } from "$app/environment";
	import InfiniteScroll from "svelte-infinite-scroll";
	import { page } from "$app/stores";

	import { goto, invalidate } from "$app/navigation";
	import Button from "$lib/components/Button.svelte";
	import Card from "$lib/components/models/Card.svelte";
	import Input from "$lib/components/fields/Input.svelte";
	import Radio from "$lib/components/fields/Radio.svelte";
	import { MODELS_FILTER_OPTIONS } from "$lib/utils/index.js";
	import GoTop from "$lib/components/GoTop.svelte";
	import Dialog from "$lib/components/dialog/Dialog.svelte";
	import SubmitModel from "$lib/components/models/Submit.svelte";
	import Drawer from "$lib/components/models/drawer/Drawer.svelte";

	export let data

	$: form = {
		filter: data?.filter,
		search: data?.search,
		page: "0",
	}
	let submitModelDialog = false;

	$: elementScroll = browser ? document?.getElementById('app') : undefined;

	const handleFetchMore = async () => {
		form = {...form, page: (Number(form.page) + 1).toString()};
		refetch(true);
	}
	const handleChangeFilter = async (filter: string) => {
		$page.url.searchParams.set('filter', filter);
		await goto(`?${$page.url.searchParams.toString()}`);
		await invalidate(url => url.pathname.includes("/api/models"));
	}
	let timeout: any;
	const handleChangeSearch = async (search: string) => {
		clearTimeout(timeout);
		timeout = setTimeout(async () => {
			if (search === "") $page.url.searchParams.delete('search');
			else $page.url.searchParams.set('search', search);
			await goto(`?${$page.url.searchParams.toString()}`);
			await invalidate(url => url.pathname.includes("/api/models"));
		}, 500);
	}
	
	const refetch = async (add: boolean) => {
		const request = await fetch(`/api/models?${new URLSearchParams(form)}`);
		const response = await request.json();
		if (add) data = {...data, models: [...data.models, ...response.cards ]};
		else {
			data.models = response.cards;
			data.total_items = response.total_items;
		}
	}
</script>

<svelte:head>
	<title>Explore Models</title>
	<meta name="description" content="Svelte demo app" />
</svelte:head>

<main class="px-6 py-10 lg:px-10 lg:py-12">
	<Dialog open={submitModelDialog} onClose={() => submitModelDialog = false}>
		<SubmitModel onClose={() => submitModelDialog = false} />
	</Dialog>
	<Drawer />
	<h1 class="text-white font-semibold text-2xl">
		Explore Models ({data?.total_items ?? 0})
	</h1>
	<div class="flex items-start sm:items-center justify-between mt-5 flex-col sm:flex-row gap-5 sm:justify-between">
		<Radio options={MODELS_FILTER_OPTIONS} value="{form.filter}" onChange={handleChangeFilter} />
		<div class="items-center justify-end gap-5 hidden lg:flex">
			<Button href="https://huggingface.co/new/stable-diffusion-lora" target="_blank" icon="ic:round-plus" theme="dark" size="lg">Create</Button>
			<!-- <UserIsLogged> -->
				<Button
					icon="octicon:upload-16"
					theme="blue"
					size="lg"
					disabled={true}
					onClick={() => submitModelDialog = true}
				>
					Upload model
				</Button>
			<!-- </UserIsLogged> -->
		</div>
		<div class="items-center justify-end gap-3 flex lg:hidden">
			<Button href="https://huggingface.co/new/stable-diffusion-lora" target="_blank" icon="ic:round-plus" theme="dark" size="md">Create</Button>
			<!-- <UserIsLogged> -->
				<Button
					icon="octicon:upload-16"
					theme="blue"
					size="md"
					disabled={true}
					onClick={() => submitModelDialog = true}
				>
					Upload model
				</Button>
			<!-- </UserIsLogged> -->
		</div>
	</div>
	<div class="mt-5 max-w-sm">
		<Input value={form.search} placeholder="Filter by model name" onChange={handleChangeSearch} />
	</div>
	<div class="mx-auto grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 2xl:grid-cols-4 gap-5 mt-8 lg:mt-10">
		{#each data.models as card}
			<Card card={card} />
		{/each}
		{#if data.models.length === 0}
			<p class="text-neutral-400 text-left w-full">No models found</p>
		{/if}
		<InfiniteScroll
			elementScroll="{elementScroll ?? undefined}"
			threshold={100}
			hasMore={data.total_items > data.models.length}
			on:loadMore={handleFetchMore}
		/>
		<GoTop />
	</div>
</main>