import { getAusweisartFromUUID } from "#components/Ausweis/types.js";
import { adminMiddleware } from "#lib/middleware/authorization.js";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
import { Enums, prisma } from "#lib/server/prisma";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "astro:content";
import { fileURLToPath } from "url";
import * as fs from "fs";
import { transport } from "#lib/mail.js";
import { BASE_URI } from "#lib/constants.js";
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
import { PERSISTENT_DIR } from "#lib/server/constants.js";

export const GET = defineApiRoute({
	input: z.object({
		uid_ausweis: z.string(),
	}),
	output: z.void(),
	middleware: adminMiddleware,
	async fetch({ uid_ausweis }, context, user) {
		const ausweisart = getAusweisartFromUUID(uid);

		if (ausweisart === "VerbrauchsausweisWohnen") {
			const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
				where: {
					uid: uid_ausweis,
				},
				include: {
					aufnahme: {
						include: {
							bilder: true,
							objekt: {
								include: {
									benutzer: true,
								},
							},
						},
					},
				},
			});

			if (!ausweis) {
				throw new APIError({
					code: "BAD_REQUEST",
					message: "Ausweis existiert nicht.",
				});
			}

			const rechnung = await prisma.rechnung.findFirst({
				where: {
					verbrauchsausweis_wohnen: {
						uid: uid_ausweis
					},
				},
				orderBy: {
					erstellt_am: "desc",
				},
			});

			if (!rechnung) {
				throw new APIError({
					code: "BAD_REQUEST",
					message:
						"Die Rechnung wurde noch nicht erstellt, wir können nicht fortfahren.",
				});
			}

			// TODO
			// SECTION: Rechnung erstellen (LexOffice)
			// Wir wollen die Rechnung an lex office versenden, und uns die ID von da holen.
			// Falls die Rechnung bereits existiert ist das nicht nötig.
			// if (!$rechnung->lex_office_id) {
			// 	[$lex_office_id, $renr] = createInvoice($ausweis, $rechnung);
			// 	sleep(1); // TODO: Nach der Umstellung von LexOffice auf etwas anderes MUSS das hier unbedingt entfernt werden!

			// 	if (!$lex_office_id || !$renr) {
			// 		die("Bei der Erstellung der Rechnung ist etwas schiefgelaufen - Möglicherweise ist etwas mit LexOffice?");
			// 	}

			// 	$rechnung->lex_office_id = $lex_office_id;
			// 	$rechnung->rechnungsnummer = $renr;
			// 	$rechnung->save();
			// }

			// TODO
			// if ($ausweis->erledigt != 2) {$ausweis->erstellungsdatum = date("Y-m-d H:i:s");}
			// $ausweis->erledigt = 2;
			// $ausweis->save();

			const pdfAusweis = await getAnsichtsausweis(ausweis, ausweis.aufnahme, ausweis.aufnahme.objekt, ausweis.aufnahme.bilder, ausweis.aufnahme.objekt.benutzer)
			const pdfDatenblatt = await getDatenblatt(
				ausweis,
				ausweis.aufnahme,
				ausweis.aufnahme.objekt,
				ausweis.aufnahme.bilder,
				ausweis.aufnahme.objekt.benutzer
			);

			if (pdfAusweis) {
				const pdfAusweisPath = fileURLToPath(
					new URL(
						`${PERSISTENT_DIR}/generated/Ausweis-${ausweis.uid}.pdf`,
						import.meta.url
					)
				);
				fs.writeFileSync(pdfAusweisPath, pdfAusweis);
			}

			if (pdfDatenblatt) {
				const pdfDatenblattPath = fileURLToPath(
					new URL(
						`${PERSISTENT_DIR}/generated/Datenblatt-${ausweis.uid}.pdf`,
						import.meta.url
					)
				);
	
				fs.writeFileSync(pdfDatenblattPath, pdfDatenblatt);
			}

			let text: string;

			if (rechnung.status === Enums.Rechnungsstatus.paid) {
				text = `
<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>

<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>

<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>

<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>

fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`;
			} else {
				text = `
<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>

<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Nachfolgend finden Sie unsere Bankverbindung. Bitte geben Sie als Verwendungszweck die Rechnungsnummer an (siehe unten). Vielen Dank.</p>

<br>
<table>
<tr><td>Kreditinstitut</td><td>:</td><td>\t Commerzbank AG</td>
<tr><td>Empfänger</td><td>:</td><td>\t IB Cornelsen</td>
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.uid}</b></td>
</table>
<br>

<p>
Alternativ können Sie auch direkt online zahlen indem Sie auf den entsprechenden Link klicken:
</p>
<br>

<table>
	<tr><td>Per Einzuglastschrift zahlen</td>    <td>:</td>     <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr>
	<tr><td>Per Sofortüberweisung zahlen</td>    <td>:</td>     <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr>
	<tr><td>Über PayPal zahlen</td>    <td>:</td>     <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr>
	<tr><td>Per Giropay zahlen</td>    <td>:</td>     <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr>
	<tr><td>Per Visa oder MasterCard zahlen</td>    <td>:</td>     <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Kreditkarte'>jetzt per Kreditkarte bezahlen</a></td></tr>
</table>
<br>

<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>

<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>

fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`;
			}

			await transport.sendMail({
				from: `"IBCornelsen" <info@online-energieausweis.org>`,
				to: user.email,
				subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.uid})`,
				text,
			});

		}
	},
});
