<script>
	import { _ } from "svelte-i18n";
	import {
		RunnerCardService,
		RunnerOrganizationService,
		RunnerTeamService,
	} from "@odit/lfk-client-js";
	import toast from "svelte-french-toast";
	import DocumentServer from "./DocumentServer.ts";

	import { init } from "@paralleldrive/cuid2";
	const createId = init({ length: 10, fingerprint: "lfk-frontend" });
	const documentServer = new DocumentServer(
		config.baseurl_documentserver,
		config.documentserver_key
	);

	export let cards_show = false;
	export let generate_cards = [];
	export let generate_runners = [];
	export let generate_orgs = [];
	export let generate_teams = [];

	function download(blob, fileName) {
		const url = window.URL.createObjectURL(blob);
		let a = document.createElement("a");
		a.href = url;
		a.download = fileName;
		document.body.appendChild(a);
		a.click();
		a.remove();
		toast.dismiss();
		toast.success($_("pdf-successfully-generated"));
	}

	function generateRunnerCards(locale) {
		if (generate_orgs.length > 0) {
			generateOrgCards(locale);
		} else if (generate_teams.length > 0) {
			generateTeamCards(locale);
		} else if (generate_runners.length > 0) {
			generateRunnersCards(locale);
		} else {
			generateCards(locale);
		}
	}

	function generateCards(locale) {
		toast.loading($_("generating-pdf"));
		documentServer
			.generateCards(generate_cards, locale)
			.then((blob) => {
				download(blob, `${$_("runnercards")}-${locale}-${createId()}.pdf`);
			})
			.catch((err) => {
				console.error(err);
			});
	}

	async function generateRunnersCards(locale) {
		toast.loading($_("generating-pdf"));
		const current_cards = await RunnerCardService.runnerCardControllerGetAll();
		let cards = [];
		for (let runner of generate_runners) {
			let card = current_cards.find((c) => c.runner?.id == runner.id);
			if (!card) {
				card = await RunnerCardService.runnerCardControllerPost({
					runner: runner.id,
				});
			}
			cards.push(card);
		}
		documentServer
			.generateCards(cards, locale)
			.then((blob) => {
				let fileName = `${$_("runnercards")}-${locale}-${createId()}.pdf`;
				if (generate_runners.length == 1) {
					fileName = `${$_("runnercards")}_${generate_runners[0].firstname}_${
						generate_runners[0].lastname
					}-${locale}-${createId()}.pdf`;
				}
				download(blob, fileName);
			})
			.catch((err) => {});
	}

	async function generateTeamCards(locale) {
		toast.loading($_("generating-pdfs"));
		let count = 0;
		const current_cards = await RunnerCardService.runnerCardControllerGetAll();
		for (const t of generate_teams) {
			const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
				t.id
			);
			let cards = [];
			for (let runner of runners) {
				let card = current_cards.find((c) => c.runner?.id == runner.id);
				if (!card) {
					card = await RunnerCardService.runnerCardControllerPost({
						runner: runner.id,
					});
				}
				cards.push(card);
			}
			documentServer
				.generateCards(cards, locale)
				.then((blob) => {
					download(
						blob,
						`${$_("runnercards")}_${t.name}-${locale}-${createId()}.pdf`
					);
				})
				.catch((err) => {});
		}
	}

	async function generateOrgCards(locale) {
		toast.loading($_("generating-pdfs"));
		const current_cards = await RunnerCardService.runnerCardControllerGetAll();
		let count = 0;
		let count_orgs = 0;
		for (const o of generate_orgs) {
			count_orgs++;
			let count = 0;
			let runners =
				await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
					o.id,
					true
				);
			let cards = [];
			for (let runner of runners) {
				let card = current_cards.find((c) => c.runner?.id == runner.id);
				if (!card) {
					card = await RunnerCardService.runnerCardControllerPost({
						runner: runner.id,
					});
				}
				cards.push(card);
			}
			await documentServer
				.generateCards(cards, locale)
				.then((blob) => {
					download(
						blob,
						`${$_("runnercards")}_${o.name}_direct-${locale}-${createId()}.pdf`
					);
				})
				.catch((err) => {});
			for (const t of o.teams) {
				count++;
				let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
					t.id
				);
				let cards = [];
				for (let runner of runners) {
					let card = current_cards.find((c) => c.runner?.id == runner.id);
					if (!card) {
						card = await RunnerCardService.runnerCardControllerPost({
							runner: runner.id,
						});
					}
					cards.push(card);
				}
				await documentServer
					.generateCards(cards, locale)
					.then((blob) => {
						download(
							blob,
							`${$_("runnercards")}_${o.name}_${
								t.name
							}-${locale}-${createId()}.pdf`
						);
					})
					.catch((err) => {});
			}
		}
	}
</script>

{#if cards_show}
	<button
		on:click={() => {
			generateRunnerCards("de");
		}}
		class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0"
	>
		{$_("generate-runnercards")}: DE
	</button>
	<button
		on:click={() => {
			generateRunnerCards("en");
		}}
		class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:w-auto sm:text-sm mb-1 lg:mb-0"
	>
		{$_("generate-runnercards")}: EN
	</button>
{/if}
