/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import { ScrollbarVisibility } from './scrollable';

export interface IScrollableElementCreationOptions {
  /**
   * The scrollable element should not do any DOM mutations until renderNow() is called.
   * Defaults to false.
   */
  lazyRender?: boolean;
  /**
   * CSS Class name for the scrollable element.
   */
  className?: string;
  /**
   * Drop subtle horizontal and vertical shadows.
   * Defaults to false.
   */
  useShadows?: boolean;
  /**
   * Handle mouse wheel (listen to mouse wheel scrolling).
   * Defaults to true
   */
  handleMouseWheel?: boolean;
  /**
   * If mouse wheel is handled, make mouse wheel scrolling smooth.
   * Defaults to true.
   */
  mouseWheelSmoothScroll?: boolean;
  /**
   * Flip axes. Treat vertical scrolling like horizontal and vice-versa.
   * Defaults to false.
   */
  flipAxes?: boolean;
  /**
   * If enabled, will scroll horizontally when scrolling vertical.
   * Defaults to false.
   */
  scrollYToX?: boolean;
  /**
   * Consume all mouse wheel events if a scrollbar is needed (i.e. scrollSize > size).
   * Defaults to false.
   */
  consumeMouseWheelIfScrollbarIsNeeded?: boolean;
  /**
   * Always consume mouse wheel events, even when scrolling is no longer possible.
   * Defaults to false.
   */
  alwaysConsumeMouseWheel?: boolean;
  /**
   * A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.
   * Defaults to 1.
   */
  mouseWheelScrollSensitivity?: number;
  /**
   * FastScrolling mulitplier speed when pressing `Alt`
   * Defaults to 5.
   */
  fastScrollSensitivity?: number;
  /**
   * Whether the scrollable will only scroll along the predominant axis when scrolling both
   * vertically and horizontally at the same time.
   * Prevents horizontal drift when scrolling vertically on a trackpad.
   * Defaults to true.
   */
  scrollPredominantAxis?: boolean;
  /**
   * The dom node events should be bound to.
   * If no listenOnDomNode is provided, the constructor dom node is used.
   */
  listenOnDomNode?: HTMLElement;
  /**
   * Control the visibility of the horizontal scrollbar.
   * Accepted values: 'auto' (on mouse over), 'visible' (always visible), 'hidden' (never visible)
   * Defaults to 'auto'.
   */
  horizontal?: ScrollbarVisibility;
  /**
   * Height (in px) of the horizontal scrollbar.
   * Defaults to 10.
   */
  horizontalScrollbarSize?: number;
  /**
   * Height (in px) of the horizontal scrollbar slider.
   * Defaults to `horizontalScrollbarSize`
   */
  horizontalSliderSize?: number;
  /**
   * Render arrows (left/right) for the horizontal scrollbar.
   * Defaults to false.
   */
  horizontalHasArrows?: boolean;
  /**
   * Control the visibility of the vertical scrollbar.
   * Accepted values: 'auto' (on mouse over), 'visible' (always visible), 'hidden' (never visible)
   * Defaults to 'auto'.
   */
  vertical?: ScrollbarVisibility;
  /**
   * Width (in px) of the vertical scrollbar.
   * Defaults to 10.
   */
  verticalScrollbarSize?: number;
  /**
   * Width (in px) of the vertical scrollbar slider.
   * Defaults to `verticalScrollbarSize`
   */
  verticalSliderSize?: number;
  /**
   * Render arrows (top/bottom) for the vertical scrollbar.
   * Defaults to false.
   */
  verticalHasArrows?: boolean;
  /**
   * Scroll gutter clicks move by page vs. jump to position.
   * Defaults to false.
   */
  scrollByPage?: boolean;
}

export interface IScrollableElementChangeOptions {
  handleMouseWheel?: boolean;
  mouseWheelScrollSensitivity?: number;
  fastScrollSensitivity?: number;
  scrollPredominantAxis?: boolean;
  horizontal?: ScrollbarVisibility;
  horizontalScrollbarSize?: number;
  horizontalHasArrows?: boolean;
  vertical?: ScrollbarVisibility;
  verticalScrollbarSize?: number;
  verticalHasArrows?: boolean;
  scrollByPage?: boolean;
}

export interface IScrollableElementResolvedOptions {
  lazyRender: boolean;
  className: string;
  useShadows: boolean;
  handleMouseWheel: boolean;
  flipAxes: boolean;
  scrollYToX: boolean;
  consumeMouseWheelIfScrollbarIsNeeded: boolean;
  alwaysConsumeMouseWheel: boolean;
  mouseWheelScrollSensitivity: number;
  fastScrollSensitivity: number;
  scrollPredominantAxis: boolean;
  mouseWheelSmoothScroll: boolean;
  listenOnDomNode: HTMLElement | null;
  horizontal: ScrollbarVisibility;
  horizontalScrollbarSize: number;
  horizontalSliderSize: number;
  horizontalHasArrows: boolean;
  vertical: ScrollbarVisibility;
  verticalScrollbarSize: number;
  verticalSliderSize: number;
  verticalHasArrows: boolean;
  scrollByPage: boolean;
}
