<script lang="ts">
	import { goto } from '$app/navigation';
	import { uploadSheetOpen } from '$lib/ui-store';
	import { pendingFiles } from '$lib/pending-upload-store';
	import CameraCapture from '$lib/components/CameraCapture.svelte';
	import type { PendingFile } from '$lib/pending-upload-store';

	let showCamera = $state(false);
	let fileInput: HTMLInputElement;

	// Keep the sheet and backdrop always in the DOM for smooth CSS transitions.
	let open = $derived($uploadSheetOpen);

	function close() {
		uploadSheetOpen.set(false);
	}

	function openGallery() {
		fileInput?.click();
	}

	function openCamera() {
		showCamera = true;
	}

	async function handleFiles() {
		const files = fileInput?.files;
		if (!files || files.length === 0) return;

		const staged: PendingFile[] = [];
		for (const file of files) {
			staged.push({ file, previewUrl: URL.createObjectURL(file) });
		}
		pendingFiles.set(staged);
		fileInput.value = '';
		close();
		await goto('/upload');
	}

	async function handleCapture(blob: Blob, type: 'photo' | 'video') {
		const ext = type === 'photo' ? 'jpg' : blob.type.includes('mp4') ? 'mp4' : 'webm';
		const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
		const fileName = `${type}_${timestamp}.${ext}`;
		const file = new File([blob], fileName, { type: blob.type });
		pendingFiles.set([{ file, previewUrl: URL.createObjectURL(file) }]);
		showCamera = false;
		close();
		await goto('/upload');
	}

	function handleCameraClose() {
		showCamera = false;
	}
</script>

<!-- Camera (rendered outside sheet so it gets full viewport) -->
{#if showCamera}
	<CameraCapture oncapture={handleCapture} onclose={handleCameraClose} />
{/if}

<!-- Hidden file input -->
<input
	bind:this={fileInput}
	type="file"
	accept="image/*,video/*"
	multiple
	class="hidden"
	onchange={handleFiles}
/>

<!-- Backdrop -->
<div
	class="fixed inset-0 z-40 bg-black/50 transition-opacity duration-300"
	class:opacity-0={!open}
	class:pointer-events-none={!open}
	class:opacity-100={open}
	onclick={close}
	aria-hidden="true"
></div>

<!-- Sheet -->
<div
	class="fixed inset-x-0 bottom-0 z-50 rounded-t-2xl bg-white transition-transform duration-300 dark:bg-gray-900"
	class:translate-y-full={!open}
	class:translate-y-0={open}
	style="padding-bottom: env(safe-area-inset-bottom)"
>
	<!-- Drag handle -->
	<div class="flex justify-center pt-3 pb-1">
		<div class="h-1 w-10 rounded-full bg-gray-300 dark:bg-gray-600"></div>
	</div>

	<div class="space-y-3 px-4 pb-4 pt-2">
		<!-- Gallery option -->
		<button
			onclick={openGallery}
			class="flex w-full items-center gap-4 rounded-xl bg-gray-50 px-5 py-4 text-left transition hover:bg-gray-100 active:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 dark:active:bg-gray-600"
		>
			<span class="flex h-11 w-11 items-center justify-center rounded-full bg-blue-100 text-blue-600 dark:bg-blue-900/40 dark:text-blue-300">
				<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5">
					<path stroke-linecap="round" stroke-linejoin="round" d="m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z" />
				</svg>
			</span>
			<div>
				<p class="font-semibold text-gray-900 dark:text-gray-100">Galerie</p>
				<p class="text-sm text-gray-500 dark:text-gray-400">Foto oder Video wählen</p>
			</div>
		</button>

		<!-- Camera option -->
		<button
			onclick={openCamera}
			class="flex w-full items-center gap-4 rounded-xl bg-gray-50 px-5 py-4 text-left transition hover:bg-gray-100 active:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 dark:active:bg-gray-600"
		>
			<span class="flex h-11 w-11 items-center justify-center rounded-full bg-purple-100 text-purple-600 dark:bg-purple-900/40 dark:text-purple-300">
				<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5">
					<path stroke-linecap="round" stroke-linejoin="round" d="M6.827 6.175A2.31 2.31 0 0 1 5.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 0 0-1.134-.175 2.31 2.31 0 0 1-1.64-1.055l-.822-1.316a2.192 2.192 0 0 0-1.736-1.039 48.774 48.774 0 0 0-5.232 0 2.192 2.192 0 0 0-1.736 1.039l-.821 1.316Z" />
					<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 12.75a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM18.75 10.5h.008v.008h-.008V10.5Z" />
				</svg>
			</span>
			<div>
				<p class="font-semibold text-gray-900 dark:text-gray-100">Kamera</p>
				<p class="text-sm text-gray-500 dark:text-gray-400">Jetzt aufnehmen</p>
			</div>
		</button>

		<!-- Cancel -->
		<button
			onclick={close}
			class="w-full rounded-xl border border-gray-200 py-3 text-sm font-medium text-gray-600 transition hover:bg-gray-50 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800"
		>
			Abbrechen
		</button>
	</div>
</div>
