export enum LabelTextAlignment {
  LEFT = 'left',
  RIGHT = 'right',
  CENTER = 'center'
}

export enum LabelLineTerminator {
  NONE = 'none',
  CIRCLE = 'circle',
  RING = 'ring'
}

export enum LabelAnchorFlag {
  NONE = 0,
  LEFT = 1 << 0,
  CENTER = 1 << 1,
  RIGHT = 1 << 2,
  TOP = 1 << 3,
  MIDDLE = 1 << 4,
  BOTTOM = 1 << 5
}

export enum LabelAnchorPoint {
  NONE = LabelAnchorFlag.NONE,
  TOPLEFT = LabelAnchorFlag.TOP | LabelAnchorFlag.LEFT,
  TOPCENTER = LabelAnchorFlag.TOP | LabelAnchorFlag.CENTER,
  TOPRIGHT = LabelAnchorFlag.TOP | LabelAnchorFlag.RIGHT,
  MIDDLELEFT = LabelAnchorFlag.MIDDLE | LabelAnchorFlag.LEFT,
  MIDDLECENTER = LabelAnchorFlag.MIDDLE | LabelAnchorFlag.CENTER,
  MIDDLERIGHT = LabelAnchorFlag.MIDDLE | LabelAnchorFlag.RIGHT,
  BOTTOMLEFT = LabelAnchorFlag.BOTTOM | LabelAnchorFlag.LEFT,
  BOTTOMCENTER = LabelAnchorFlag.BOTTOM | LabelAnchorFlag.CENTER,
  BOTTOMRIGHT = LabelAnchorFlag.BOTTOM | LabelAnchorFlag.RIGHT
}

/**
 * Class representing label style.
 * @ignore
 */
export class NVLabel3DStyle {
  textColor: number[]
  textScale: number
  textAlignment?: LabelTextAlignment
  lineWidth: number
  lineColor: number[]
  lineTerminator: LabelLineTerminator
  bulletScale?: number
  bulletColor?: number[]
  backgroundColor?: number[]

  /**
   * @param textColor - Color of text
   * @param textScale - Text Size (0.0..1.0)
   * @param lineWidth - Line width
   * @param lineColor - Line color
   * @param bulletScale - Bullet size respective of text
   * @param bulletColor - Bullet color
   * @param backgroundColor - Background color of label
   */
  constructor(
    textColor = [1.0, 1.0, 1.0, 1.0],
    textScale = 1.0,
    textAlignment = LabelTextAlignment.LEFT,
    lineWidth = 0.0,
    lineColor = [0.0, 0.0, 0.0],
    lineTerminator = LabelLineTerminator.NONE,
    bulletScale?: number,
    bulletColor?: number[],
    backgroundColor?: number[]
  ) {
    this.textColor = textColor
    this.textScale = textScale
    this.textAlignment = textAlignment
    this.lineWidth = lineWidth
    this.lineColor = lineColor
    this.lineTerminator = lineTerminator
    this.bulletScale = bulletScale
    this.bulletColor = bulletColor
    this.backgroundColor = backgroundColor
  }
}

/**
 * Label class
 * @ignore
 */
export class NVLabel3D {
  text: string
  style: NVLabel3DStyle
  points?: number[] | number[][]
  anchor: LabelAnchorPoint
  onClick?: (label: NVLabel3D) => void

  /**
   * @param text - The text of the label
   * @param style - The style of the label
   * @param points - An array of points label for label lines
   */
  constructor(
    text: string,
    style: NVLabel3DStyle,
    points?: number[] | number[][],
    anchor?: LabelAnchorPoint,
    onClick?: (label: NVLabel3D) => void
  ) {
    this.text = text
    this.style = style
    this.points = points
    this.anchor = anchor || LabelAnchorPoint.NONE
    this.onClick = onClick
  }
}
