import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { LEX_OFFICE_API_KEY } from "#lib/constants.js";
import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma";
import { prisma } from "#lib/server/prisma";
import moment from "moment";

export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: {
	bezeichnung: string,
	positionstext: string,
	preis: number,
	anschreiben: string
}, aufnahme: Aufnahme, rechnung: Rechnung, user: Benutzer) {;
	if (!user.lex_office_id) {
		const lex_office_id = await createLexOfficeCustomer(user);

		if (!lex_office_id) {
			throw new Error("Beim erstellen der Lex Office ID ist etwas schiefgelaufen.")
		}

		user.lex_office_id = lex_office_id

		await prisma.benutzer.update({
			where: {
				id: user.id
			},
			data: {
				lex_office_id
			}
		})
	}
	
	let response: Response;
	response = await fetch("https://api.lexoffice.io/v1/quotations?finalize=true", {
		method: "POST",
		headers: {
			Accept: "application/json",
			Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
			"Content-Type": "application/json"
		},
		body: JSON.stringify({
			"voucherDate": moment(aufnahme.erstellungsdatum).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
			"expirationDate": moment(aufnahme.erstellungsdatum).add(1, "month").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
			"taxConditions": {
				"taxType": "gross"
			},
			"shippingConditions": {
				"shippingType": "none"
			},
			"address": {
				"contactId": user.lex_office_id,
				"name": `${user.vorname} ${user.name}`,
				"street": rechnung.strasse,
				"city": rechnung.ort,
				"zip": rechnung.plz,
				"countryCode": "DE",
				"supplement": rechnung.zusatzzeile
			},
			"lineItems": [
				{
					"type": "custom",
					"name": options.bezeichnung,
					"description": options.positionstext,
					"quantity": 1,
					"lineItemAmount": options.preis,
					"unitName": options.bezeichnung,
					"unitPrice": {
						"currency": "EUR",
						"grossAmount": options.preis,
						"taxRatePercentage": 19
					}
				}
			],
			"totalPrice": {
				"currency": "EUR",
				"totalGrossAmount": options.preis,
			},
			"introduction": options.anschreiben,
			"remark": "Wir freuen uns auf Ihre Auftragserteilung und sichern eine einwandfreie Ausführung zu."
		})
	})
	
	const result = await response.json();

	if (!result.id) {
		throw new Error(`Ein Fehler ist aufgetreten: ${result.message}`);
	}

	// Rechnung PDF Holen

	const lex_office_id = result.id;

	response = await fetch(`https://api.lexoffice.io/v1/quotations/${lex_office_id}/document`, {
		headers: {
			Accept: "application/json",
			Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
			"Content-Type": "application/json"
		},
	})
	
	const pdfResult = await response.json()

	if (!pdfResult.documentFileId) {
		throw new Error(`Ein Fehler ist aufgetreten: ${pdfResult.message}`);
	}
	
	$pdf_id = $render_response["documentFileId"];
	
	db()->execute("UPDATE Angebotsanfragen SET
	Adresse_Objekt = :Adresse_Objekt,
	PLZ_Objekt = :PLZ_Objekt,
	Ort_Objekt = :Ort_Objekt,
	Dienstleistung = :Dienstleistung,
	Empfaengerrechnung = :Empfaengerrechnung,
	Zusatzzeilerechnung = :Zusatzzeilerechnung,
	Adresse = :Adresse,
	PLZ = :PLZ,
	Ort = :Ort,
	Anlass = :Anlass,
	Baujahrheizung = :Baujahrheizung,
	Baujahrgebaeude = :Baujahrgebaeude,
	Baujahrklima = :Baujahrklima,
	Gebaeudetyp = :Gebaeudetyp,
	Nutzflaeche = :Nutzflaeche,
	Sanierungsstatus = :Sanierungsstatus,
	Nachricht = :Nachricht,
	Datei = :Datei,
	Rolle = :Rolle,
	Email = :Email,
	Angebotspreis = :Angebotspreis,
	Rabatt = :Rabatt,
	`Status` = 'Verschickt',
	lex_office_id = :lex_office_id,
	Textanschreiben = :Textanschreiben,
	Positionstext = :Positionstext
	WHERE Auftragsnummer = :Auftragsnummer", [
		"Adresse_Objekt": $_POST["gebaeude_strasse"],
		"PLZ_Objekt": $_POST["gebaeude_plz"],
		"Ort_Objekt": $_POST["gebaeude_ort"],
		"Dienstleistung": $_POST["dienstleistung"],
		"Empfaengerrechnung": $_POST["rechnung_empfaenger"],
		"Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"],
		"Adresse": $_POST["rechnung_strasse"],
		"PLZ": $_POST["rechnung_plz"],
		"Ort": $_POST["rechnung_ort"],
		"Anlass": $_POST["anlass"],
		"Baujahrheizung": $_POST["baujahr_heizung"],
		"Baujahrgebaeude": $_POST["baujahr_gebaeude"],
		"Baujahrklima": $_POST["baujahr_klimaanlage"],
		"Gebaeudetyp": $_POST["gebaeudetyp"],
		"Nutzflaeche": $_POST["nutzflaeche"],
		"Sanierungsstatus": $_POST["sanierungsstatus"],
		"Nachricht": $_POST["nachricht"],
		"Datei": $dateien,
		"Rolle": $_POST["rolle"],
		"Email": $_POST["email"],
		"Angebotspreis": $_POST["Angebotspreis"],
		"Rabatt": $_POST["Rabatt"],
		"lex_office_id": $lex_office_id,
		"Textanschreiben": $_POST["Textanschreiben"],
		"Positionstext": $_POST["Positionstext"],
		"Auftragsnummer": $_POST["Auftragsnummer"]
	]);
	
	// Die Auftragsnummer abfragen
	
	$curl_nummer = curl_init();
	
	curl_setopt_array($curl_nummer, [
		CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id",
		CURLOPT_RETURNTRANSFER: true,
		CURLOPT_ENCODING: "",
		CURLOPT_MAXREDIRS: 10,
		CURLOPT_TIMEOUT: 30,
		CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
		CURLOPT_CUSTOMREQUEST: "GET",
		CURLOPT_HTTPHEADER: [
			"Accept: application/json",
			"Authorization: Bearer " . LEX_OFFICE_API_KEY
		]
	]);
	
	$nummer_response = curl_exec($curl_nummer);
	$nummer_response = json_decode($nummer_response, true);
	$err = curl_error($curl_nummer);
	
	curl_close($curl_nummer);
	
	// Und die Mail verschicken
	
	$mail = new PHPMailer\PHPMailer\PHPMailer(true);
	
	$mail->IsSMTP();
	$mail->Host = "smtp.ionos.de";
	$mail->SMTPAuth = true;
	$mail->Username = 'info@online-energieausweis.org';
	$mail->Password = 'Katendeich5a2024!';
	
	$mail->CharSet = 'UTF-8';
	$mail->Encoding  = 'base64';
	$mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0);
	$mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]);
	$mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen");
	$mail->isHTML(true);
	$mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}";
	
	
	// carriage return type (RFC)
	$eol = "<br>";
	$anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"];
	
	$message = "$anrede {$_POST["name"]},{$eol}{$eol}";
	$message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}";
	$message .= "Mit freundlichen Grüßen,$eol";
	$message .= "Jens Cornelsen$eol";
	$message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon   040 209339858{$eol}Fax   040 209339859";
	$mail->Body = $message;
	
	$curl_pdf = curl_init();
	
	curl_setopt_array($curl_pdf, [
		CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id",
		CURLOPT_RETURNTRANSFER: true,
		CURLOPT_ENCODING: "",
		CURLOPT_MAXREDIRS: 10,
		CURLOPT_TIMEOUT: 30,
		CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
		CURLOPT_CUSTOMREQUEST: "GET",
		CURLOPT_HTTPHEADER: [
			"Accept: application/pdf",
			"Authorization: Bearer " . LEX_OFFICE_API_KEY
		]
	]);
	
	$response = curl_exec($curl_pdf);
	$err = curl_error($curl_pdf);
	
	$HOME = dirname($ROOT);
	
	curl_close($curl_pdf);
	$fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+");
	fwrite($fp, $response);
	fclose($fp);
	
	$mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf");
	
	$mail->send();
	
	echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen.";
}

export async function createLexOfficeCustomer(user: Benutzer) {
	if (!user.adresse) {
		return null;
	}

	const response = await fetch("https://api.lexoffice.io/v1/contacts", {
		body: JSON.stringify({
				"version": "0",
				"company": {
					"name": `${user.vorname} ${user.name}`
				},
				"note": "",
				"roles": {
					"customer": {}
				},
				"addresses": {
			"billing": [{
				"street": user.adresse,
				"zip": user.plz,
				"city": user.ort,
				"countryCode": "DE"
			}]
		},
				"emailAddresses": {
					"business": user.email
				}
		}),
		method: "POST",
		headers: {
			Accept: "application/json",
			Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
			"Content-Type": "application/json"
		}
	})

	const result = await response.json();

	if (!result.id) {
		return null;
	}


	return result.id;
}