import { PDFPage } from "pdf-lib";
import { PDFElement, Size } from "./PDFElement.js";

export type Margin = {
	top: number,
	left: number,
	right: number,
	bottom: number
}

export type Padding = Margin;

export class Layout extends PDFElement {
	public margin: Margin
	public padding: Padding
	protected _height: Size = "auto";
	protected _width: Size = "auto";


	public children: PDFElement[];

	constructor(children: PDFElement[] = [], options?: {
		margin?: Margin,
		padding?: Padding
	}) {
		super()

		this.children = children
		this.margin = options?.margin || {
			bottom: 0,
			left: 0,
			right: 0,
			top: 0
		};

		this.padding = options?.padding || {
			bottom: 0,
			left: 0,
			right: 0,
			top: 0
		};
	}

	get height(): number {
		if (typeof this._height === "number") {
			return this._height;
		}

		let currentHeight = 0

		for (const child of this.children) {
			currentHeight += child.height;
		}

		return currentHeight;
	}

	set height(value: number) {
		this._height = value;
	}

	draw(page: PDFPage, x: number, y: number): void {
		let currentY = y - this.margin.top - this.padding.top;

		for (const child of this.children) {
			child.draw(page, x + this.margin.left + this.padding.left, currentY);

			currentY -= child.height + child.margin.top + child.margin.bottom;
		}
	}

	addChild(...children: PDFElement[]): void {
			this.children.push(...children)
	}
}

export function layout(...args: ConstructorParameters<typeof Layout>) {
	return new Layout(...args);
}