import {
	LayoutGrowth,
	LegendPositions,
	Alignments,
	ToolbarControlTypes,
	ZoomBarTypes,
} from './enums';
import { Component } from '../components/component';
import { TruncationOptions } from './truncation';

/**
 * customize the overlay contents
 */
export interface LayoutComponentChild {
	id: string;
	/**
	 * the component that'll be rendered inside layout child
	 */
	components: Component[];
	/**
	 * size of the layout child
	 */
	size?: number;
	/**
	 * how the layout child will grow or shrink in x & y directions
	 */
	growth?: {
		x: LayoutGrowth;
		y: LayoutGrowth;
	};
}

/**
 * customize the legend component
 */
export interface LegendOptions {
	enabled?: boolean;
	position?: LegendPositions;
	/**
	 * the clickability of legend items
	 */
	clickable?: boolean;
	truncation?: TruncationOptions;
	alignment?: Alignments;
	order?: string[];
}

export interface TooltipOptions {
	/**
	 * enable or disable tooltip
	 */
	enabled?: boolean;
	/**
	 * a function to format the tooltip values
	 */
	valueFormatter?: Function;
	/**
	 * custom function for returning tooltip HTML
	 * passed an array or object with the data, and then the default tooltip markup
	 */
	customHTML?: Function;
	/**
	 * customizes the `Group` label shown inside tooltips
	 */
	groupLabel?: string;
	/**
	 * show total of items
	 */
	showTotal?: boolean;
	/**
	 * customizes the `Total` label shown inside tooltips
	 */
	totalLabel?: string;
	truncation?: TruncationOptions;
}

/**
 * Threshold options
 */
export interface ThresholdOptions {
	/**
	 * threshold value
	 */
	value: number | Date;
	/**
	 * a function to format the threshold values
	 */
	valueFormatter?: Function;
	/**
	 * hex threshold line color
	 */
	fillColor: string;
	/**
	 * threshold label
	 */
	label: string;
}

export interface GridOptions {
	y?: {
		enabled?: boolean;
		numberOfTicks?: number;
	};
	x?: {
		enabled?: boolean;
		numberOfTicks?: number;
	};
}

/**
 * Ruler options
 */
export interface RulerOptions {
	enabled?: boolean;
}

export interface BarOptions {
	width?: number;
	maxWidth?: number;
}

export interface StackedBarOptions extends BarOptions {
	dividerSize?: number;
}

/**
 * customize the Toolbar component
 */
export interface ToolbarOptions {
	/**
	 * is the toolbar visible or not
	 */
	enabled?: boolean;
	/**
	 * the maximum toolbar controls to be displayed as icons
	 * controls more than this number will appear in the overflow menu
	 * minimum is 1. (all toolbar controls are in overflow menu)
	 */
	numberOfIcons?: number;
	/**
	 * toolbar controls which will be displayed following the array order
	 */
	controls?: ToolbarControl[];
}

/**
 * options for each toolbar control
 */
export interface ToolbarControl {
	/**
	 * the toolbar control type
	 */
	type: ToolbarControlTypes;
	/**
	 * the text to display (if this control is displayed in overflow menu)
	 * type value will be displayed if text is not available
	 */
	text?: string;
}

/**
 * customize the ZoomBars in a chart
 */
export interface ZoomBarsOptions {
	/**
	 * a variable to handle default zoom in ratio (0 ~ 1.0)
	 * ex: shift click zoom in ratio
	 */
	zoomRatio?: number;
	/**
	 * a variable to define the minimum zoom ratio (0 ~ 1.0)
	 * If  ( zoom domain / max domain ) < minZoomRatio, zoom-in functions will be disabled
	 */
	minZoomRatio?: number;
	/**
	 * currently only the top position is supported
	 */
	top?: ZoomBarOptions;
	/**
	 * whether keep updating range axis in real time while zoom domain is changing
	 */
	updateRangeAxis?: boolean;
}

/**
 * customize the ZoomBar component
 */
export interface ZoomBarOptions {
	/**
	 * is the zoom-bar visible or not
	 */
	enabled?: boolean;
	/**
	 * is the zoom-bar in loading state
	 */
	loading?: boolean;
	/**
	 * is the zoom-bar in locked state
	 */
	locked?: boolean;
	/**
	 * whether the zoom bar is showing a slider view or a graph view etc.
	 */
	type?: ZoomBarTypes;
	/**
	 * an two element array which represents the initial zoom domain
	 */
	initialZoomDomain?: Object[];
	/**
	 * options related to zoom bar data
	 */
	data?: Object[];
}
