import {ServiceError} from "@grpc/grpc-js";
import {Access} from "../../access";
import {IronPdfServiceClient} from "../../generated_proto/ironpdfengineproto/IronPdfService";
import {PdfiumGetBookmarksDescriptorResultP__Output} from "../../generated_proto/ironpdfengineproto/PdfiumGetBookmarksDescriptorResultP";
import {Bookmark} from "../../../public/bookmark";
import {handleRemoteException} from "../util";

/**
 * Retrieve the document's outline bookmarks via the {@code Pdfium_Bookmark_GetBookmarksDescriptor}
 * unary RPC. Mirrors {@code IronPdf.PdfDocument.Bookmarks} on the C# side.
 */
export async function getBookmarks(id: string): Promise<Bookmark[]> {
	const client: IronPdfServiceClient = await Access.ensureConnection();

	return new Promise(
		(resolve: (_: Bookmark[]) => void, reject: (errorMsg: string) => void) => {
			client.Pdfium_Bookmark_GetBookmarksDescriptor(
				{document: {documentId: id}},
				(
					err: ServiceError | null,
					value: PdfiumGetBookmarksDescriptorResultP__Output | undefined
				) => {
					if (err) {
						reject(`${err.name}/n${err.message}`);
						return;
					}
					if (!value) {
						reject("No response from IronPdfEngine for getBookmarks");
						return;
					}
					if (value.exception) {
						handleRemoteException(value.exception, reject);
						return;
					}

					const descriptors = value.result?.bookmarkDescriptors ?? [];
					resolve(
						descriptors.map(d => ({
							text: d.text ?? "",
							pageIndex: d.pageIndex ?? 0,
							hierarchy: d.hierarchy ?? "",
							itemId: d.itemId ?? "",
							parentItemId: d.parentItemId ?? "",
						}))
					);
				}
			);
		}
	);
}