import {ServiceError} from "@grpc/grpc-js";
import {IronPdfServiceClient} from "../../generated_proto/ironpdfengineproto/IronPdfService";
import {Access} from "../../access";
import {EmptyResultP__Output} from "../../generated_proto/ironpdfengineproto/EmptyResultP";
import {
	chunkBuffer,
	handleEmptyResultP__Output,
	handleRemoteException
} from "../util";
import fs from "fs";
import {PdfDocumentResultP__Output} from "../../generated_proto/ironpdfengineproto/PdfDocumentResultP";

export enum PdfAVersions {
	PdfA1b = 1,
	PdfA2b = 2,
	PdfA3b = 3,
	PdfA1a = 5,
	PdfA2a = 6,
	PdfA3a = 7,
	PdfA4 = 8,
	PdfA4e = 9,
	PdfA4f = 10
}

export enum PdfUAVersions {
	PdfUA1 = 1,
	PdfUA2 = 2
}

export async function toPdfA(id: string, pdfaVersion: PdfAVersions, customICCFilePath?: string): Promise<void> {
	console.log(pdfaVersion);
	const client: IronPdfServiceClient = await Access.ensureConnection();
	return new Promise(
		(resolve: () => void, reject: (errorMsg: string) => void) => {
			const stream = client.Pdfium_ConvertToPdfA(
				(
					err: ServiceError | null,
					value: PdfDocumentResultP__Output | undefined
				) => {
					if (err) {
						reject(`${err.name}/n${err.message}`);
					} else if (value) {
						if (value?.exception) {
							handleRemoteException(value.exception, reject);
						}else{
							resolve()
						}
					}
				}
			);

			stream.write({
				info: {
					document: {documentId: id},
					pdfaVersion: pdfaVersion
				}
			})

			if (customICCFilePath) {
				chunkBuffer(fs.readFileSync(customICCFilePath)).forEach((chunk) => {
					stream.write({
						iccBytesChunk: chunk
					});
				});
			} else {
				stream.write({
					iccBytesChunk: Buffer.alloc(0)
				});
			}
			stream.end()
		}
	);
}


export async function toPdfUA(id: string, naturalLanguages: number, pdfUaVersion: PdfUAVersions = PdfUAVersions.PdfUA1): Promise<void> {
	const client: IronPdfServiceClient = await Access.ensureConnection();
	return new Promise(
		(resolve: () => void, reject: (errorMsg: string) => void) => {
			client.Pdfium_ConvertToPdfUA(
				{
					document: { documentId: id },
					lang: naturalLanguages,
					pdfUaVersion: pdfUaVersion,
				},
				(
					err: ServiceError | null,
					value: EmptyResultP__Output | undefined
				) => {
					if (err) {
						reject(`${err.name}/n${err.message}`);
					} else if (value) {
						handleEmptyResultP__Output(value, reject);
						resolve();
					}
				}
			);
		}
	);
}

export async function toPdfUAForScreenReader(id: string, htmlDom: string, naturalLanguages: number): Promise<void> {
	const client: IronPdfServiceClient = await Access.ensureConnection();
	return new Promise(
		(resolve: () => void, reject: (errorMsg: string) => void) => {
			client.Pdfium_ConvertToPdfUAForScreenReader(
				{
					document: { documentId: id },
					htmlDom: htmlDom,
					lang: naturalLanguages,
				},
				(
					err: ServiceError | null,
					value: EmptyResultP__Output | undefined
				) => {
					if (err) {
						reject(`${err.name}/n${err.message}`);
					} else if (value) {
						handleEmptyResultP__Output(value, reject);
						resolve();
					}
				}
			);
		}
	);
}
