<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";

	let { data }: { data: { token: string } } = $props();

	$effect(() => {
		console.log("Data:", data.token)
	})

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

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

	let monitorList: Map<number, Heartbeat> = $state(new Map());

	//let token = $props();

	$effect(() => {
		if (data.token) {
			const socket = io('https://status.neshweb.net/');

			socket.on('connect', () => {
				socket.emit("loginByToken", data.token, (res) => {
					console.log(data.token)
					console.log(res);
				})
			});

			socket.on('heartbeatList', (idString: 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());
			})

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


	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">
	{#each services as service}
		<ServiceCard {service} {icons} monitor={monitorList.get(service.id)} />
	{/each}
</div>