<svelte:options runes={true} />

<script lang="ts">
	import ServiceCard from '$lib/components/ServiceCard.svelte';
	import type { Service } from '$lib/types/data-types';
	import { io } from 'socket.io-client';
	import type { Heartbeat } from '$lib/types/uptime-kuma-types';
	import { socketStore } from '$lib/stores/socketStore';
	import { onDestroy } from 'svelte';
	import { uptimeStore } from '$lib/stores/uptimeStore';

	let { data }: { data: { promise: Promise<string> } } = $props();

	let token = $state();

	data.promise.then((jwt) => {
		token = jwt;
	});

	let services: readonly Service[] = $state.frozen([]);

	let icons: readonly string[] = $state.frozen([]);

	let monitorList = $state($uptimeStore);

	let socket = $socketStore;

	$effect(() => {
		if (token) {
			if (!socket.connected) {
				socket.connect();
			} else {
				console.log('connected');
			}
			socket.on('connect', () => {
				console.log('login');
				socket.emit('loginByToken', token, () => {});
			});

			socket.on('heartbeatList', (_: string, data) => {
				let recent = data[data.length - 1];
				let monitor: Heartbeat = {
					monitorID: recent.monitor_id,
					status: recent.status,
					time: recent.time,
					msg: recent.msg,
					ping: recent.ping,
					important: recent.important,
					duration: recent.duration
				};
				monitorList.set(monitor.monitorID, monitor);
				monitorList = new Map(monitorList.entries());
				$uptimeStore = monitorList;
			});

			socket.on('heartbeat', (data) => {
				monitorList.set(data.monitorID, data);
				monitorList = new Map(monitorList.entries());
				$uptimeStore = monitorList;
			});
		}
	});

	async function get(url: string): Promise<any> {
		let res = await fetch(url);
		if (res.ok) {
			let data = await res.json();
			return data;
		} else {
			return Promise.reject();
		}
	}

	$effect(() => {
		get('/data/services').then((data: Service[]) => {
			services = data;
		});
	});

	$effect(() => {
		get('/assets/icons').then((data: string[]) => {
			icons = data;
		});
	});
</script>

<svelte:head>
	<title>Services</title>
	<meta name="description" content="Overview of Services running on neshweb.net" />
</svelte:head>

<div class="flex max-h-full flex-row flex-wrap justify-center gap-10 overflow-auto p-8 pt-24">
	{#each services as service}
		<ServiceCard {service} {icons} monitor={monitorList.get(service.id)} />
	{/each}
</div>