import { PDFPage, PDFFont, rgb, RGB, PDFImage } from 'pdf-lib';
import { PDFElement, Size } from './PDFElement.js';
import { Margin, Padding } from './Layout.js';
import * as fs from "fs"

export interface ImageOptions {
	margin?: Margin,
	width?: number,
	height?: number,
	src?: string,
	data?: string
}

export class Image extends PDFElement {
	private options: ImageOptions

	protected _width: number;
	protected _height: number;

	public margin: Margin

	constructor(options: ImageOptions) {
		super();

		this._width = options.width || 0;
		this._height = options.height || 0;
		this.options = options;
		this.margin = this.options.margin || { top: 0, left: 0, right: 0, bottom: 0}
	}

	addChild(...children: PDFElement[]): void {
		throw new Error("Cannot add child element to Image")
	}

	get height() {
		return this._height;
	}

	get width() {
		return this._width;
	}

	async draw(page: PDFPage, x: number, y: number) {
		let embed: PDFImage;
		if (this.options.src) {
			if (!fs.existsSync(this.options.src)) {
				return;
			}

			const img = fs.readFileSync(this.options.src)
			if (this.options.src.split(".").pop() === "png") {
				embed = await page.doc.embedPng(img)
			} else {
				embed = await page.doc.embedJpg(img)
			}
		} else if (this.options.data) {
			embed = await page.doc.embedJpg(this.options.data)
		} else {
			return
		}

		if (this._height === 0) {
			if (this._width) {
				this._height = embed.height * (this._width / embed.width)
			}
		}

		if (this._width === 0) {
			if (this._height) {
				this._width = embed.width * (this._height / embed.height)
			}
		}



		page.drawImage(embed, {
			x: x + this.margin.left + this.padding.left,
			y: y - this.height - this.margin.top - this.padding.top,
			height: this.height,
			width: this.width,
		})
	}
}
