import { ChartArea } from './geometric';

export type LayoutPosition = 'left' | 'top' | 'right' | 'bottom' | 'center' | 'chartArea' | {[scaleId: string]: number};

export interface LayoutItem {
	/**
	 * The position of the item in the chart layout. Possible values are
	 */
	position: LayoutPosition;
	/**
	 * The weight used to sort the item. Higher weights are further away from the chart area
	 */
	weight: number;
	/**
	 * if true, and the item is horizontal, then push vertical boxes down
	 */
	fullSize: boolean;
	/**
	 * Width of item. Must be valid after update()
	 */
	width: number;
	/**
	 * Height of item. Must be valid after update()
	 */
	height: number;
	/**
	 * Left edge of the item. Set by layout system and cannot be used in update
	 */
	left: number;
	/**
	 * Top edge of the item. Set by layout system and cannot be used in update
	 */
	top: number;
	/**
	 * Right edge of the item. Set by layout system and cannot be used in update
	 */
	right: number;
	/**
	 * Bottom edge of the item. Set by layout system and cannot be used in update
	 */
	bottom: number;

	/**
	 * Called before the layout process starts
	 */
	beforeLayout?(): void;
	/**
	 * Draws the element
	 */
	draw(chartArea: ChartArea): void;
	/**
	 * Returns an object with padding on the edges
	 */
	getPadding?(): ChartArea;
	/**
	 * returns true if the layout item is horizontal (ie. top or bottom)
	 */
	isHorizontal(): boolean;
	/**
	 * Takes two parameters: width and height.
	 * @param width
	 * @param height
	 */
	update(width: number, height: number, margins?: ChartArea): void;
}
